使用正则表达式预先匹配所有非URL

时间:2013-03-31 11:22:38

标签: python regex url negative-lookahead

在Python / django中,我有一个字符串,通过匹配“:”字符前面的字符来提取“标题”,如:

some_string = "This is my Title: This is some text"

所以我正在使用此代码提取标题:

result = regex.search('(.*):', some_string)
result.group(1)
>>> 'This is my Title'

当用户在字符串中只放置一个url时会出现问题,例如:

some_string = 'http://vimeo.com/49742318'
result.group(1)
>>> 'http'

我更喜欢只有一个空字符串。我已经尝试过使用负向前看metatag(?!):

result = regex.search('(.*(?!http)):', some_string)

但它仍然返回'http'而不是空字符串。怎么会这样?

1 个答案:

答案 0 :(得分:2)

问题是,在您放置负向前瞻的位置,下一个字符也被限制为冒号:负向前瞻成功,因为h不是下一个字符!

你可能实际想要的是将冒号放在冒号之后,以便下一个字符不是/

(.*):(?!/)

但在那时你也可以使用积极的前瞻并完全停止使用捕获组。您也不应该允许捕获冒号,或者RE可以比您预期的消耗更多:

result = regex.search('[^:]*(?=:[^/])', some_string)
result.group()