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

REGEX: Match all instances of text, digits, + , _ and -, Between colons, which are NOT part of an URL

我想查找并替换(不替换)冒号之间的所有文本实例,例如:

:微笑: :thumbs_up: :+1: :-1:

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

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

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

我在浏览时发现了这个 url :smile: http://pdf.reuters.com/htmlnews/htmlnews.asp?i=43059c3bf0e37541&u=urn:newsml:reuters.com:20190417:nPn5XHnXBa 太棒了 :smile::+1: 记住:别忘了投票!

我希望结果是:

我在浏览时发现了这个 url http://pdf.reuters.com/htmlnews/htmlnews.asp?i=43059c3bf0e37541&u=urn:newsml:reuters.com:20190417:nPn5XHnXBa 太棒了记住:别忘了投票!

我正在使用 python 正则表达式模块进行替换。

我的想法是: "Ok, I should find any URL and tell the regex to IGNORE any matches that are part of the URL"

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

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

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

所以...我希望使用负前瞻并像这样组合这两个: (?!http[^\s]+)(:[\w+-]+:)

这几乎是完美的,但它最终匹配了 URL 的这两个部分: :新闻: 和 :20190417:

我如何构建此正则表达式以使其匹配文本中的所有位置,除非冒号是 URL 的一部分?

万分感谢!

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

一个选项是让你的正则表达式匹配 URL 模式(在一个组中捕获), 匹配包含在 : 中的内容,并且然后你可以替换为第一个捕获的组:

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

替换为


这确保 URLS 将保留在文本中的位置(被匹配并替换为它们自己),但是您要删除的冒号部分将被匹配并替换为任何内容。

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