URL正则表达式排除特定域不正确匹配

时间:2013-03-27 15:46:09

标签: python regex

我正在尝试将一些表达式与正则表达式匹配,但它不起作用。我想匹配一个不以http://www.domain.com开头的字符串。这是我的正则表达式:

^https?:\/\/(www\.)?(?!domain\.com)

我的正则表达式有问题吗?

我想匹配以http://开头但与http://site.com不同的表达式 例如:

/page.html => false
http://www.google.fr => true
http://site.com => false
http://site.com/page.html => false

3 个答案:

答案 0 :(得分:6)

使用此选项可匹配您没有提及的域名的网址:https?://(?!(www\.domain\.com\/?)).*

行动中的示例:http://regexr.com?34a7p

答案 1 :(得分:1)

这里的问题是,当正则表达式引擎遇到负面前瞻的成功匹配时,它会将匹配视为失败(如预期的那样),并回溯到前一组(www\.)量化为可选,然后看看表达式是否成功没有它。这就是你所看到的。

这可以通过应用原子分组或占有量词来解决,以“忘记”回溯的可能性。不幸的是,python正则表达式本身不支持这种情况。相反,你将不得不使用效率低得多的方法:使用更大的前瞻。

^https?:\/\/(?!(www\.)?(domain\.com))

答案 2 :(得分:0)

你想要一个负面的预见断言:

^https?://(?!(?:www\.)?site\.com).+

给出了:

>>> testdata = '''\
... /page.html => false
... http://www.google.fr => true
... http://site.com => false
... http://site.com/page.html => false
... '''.splitlines()
>>> not_site_com = re.compile(r'^https?://(?!(?:www\.)?site\.com).+')
>>> for line in testdata:
...     match = not_site_com.search(line)
...     if match: print match.group()
... 
http://www.google.fr => true

请注意,该模式不包括www.site.com site.com

>>> not_site_com.search('https://www.site.com')
>>> not_site_com.search('https://site.com')
>>> not_site_com.search('https://site-different.com')
<_sre.SRE_Match object at 0x10a548510>