REGEX:匹配文本,数字,+,_和 - ,冒号之间的所有实例,它们不是URL的一部分

问题描述 投票:1回答:1

我想在冒号之间找到并替换(没有任何)文本的所有实例,例如:

:smile :: thumbs_up :: + 1:: - 1:

但不是如果冒号是网址的一部分,例如这个网址:http://pdf.reuters.com/htmlnews/htmlnews.asp?i=43059c3bf0e37541&u=urn:newsml:reuters.com:20190417:nPn5XHnXBa

如您所见,此URL有几个冒号,应忽略任何此类匹配。

完整的文本也可以在之前和之后都有一些文本。此外,这些也可以连续出现,中间没有任何空格。例如:

我正在浏览并发现这个网址:微笑:http://pdf.reuters.com/htmlnews/htmlnews.asp?i=43059c3bf0e37541&u=urn:newsml:reuters.com:20190417:nPn5XHnXBa这太棒了:微笑:: + 1:记住:不要忘记upvote!

我希望结果如下:

我正在浏览并发现这个网址http://pdf.reuters.com/htmlnews/htmlnews.asp?i=43059c3bf0e37541&u=urn:newsml:reuters.com:20190417:nPn5XHnXBa它太棒了记住:别忘了upvote!

我正在使用python regex模块进行替换。

我的想法是:“好的,我应该找到任何URL并告诉正则表达式IGNORE任何属于URL的匹配”

所以我有正则表达式成功匹配任何URL如下:(http [^ \ s] +)

这将找到http和其他任何内容,直到非空白字符或换行符,这将指示URL的结尾。

我也有正则表达式来匹配(包括)冒号之间的文本:(:[\ w + - ] + :)

所以...我希望使用负向前瞻并将这两个结合起来:(?!http [^ \ s] +)(:[\ w + - ] + :)

这几乎是完美的,但最终匹配URL的这两部分:: newsml:和:20190417:

我如何构建这个正则表达式,使其匹配文本中的任何位置,如果冒号是URL的一部分除外?

太感谢了!

PS。我一直在使用这个很棒的网站来测试我的模式... https://regexr.com/

regex python-3.x regex-negation
1个回答
0
投票

一种选择是使您的正则表达式匹配URL模式(在组中捕获),或匹配:s中包含的内容,然后您可以替换为第一个捕获的组:

(https?://\S+)|:[\w+-]+:

用。。。来代替

\1

这可以确保URLS将保留在文本中的位置(匹配并替换为自己),但是要删除的冒号部分将匹配并替换为空。

https://regex101.com/r/d7mM1s/2

© www.soinside.com 2019 - 2024. All rights reserved.