我正在尝试将一些表达式与正则表达式匹配,但它不起作用。我想匹配一个不以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
答案 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>