0

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

3 回答 3

7

使用它来匹配没有您提到的域的 URL:https?://(?!(www\.domain\.com\/?)).*

实例:http ://regexr.com?34a7p

于 2013-03-27T16:02:58.633 回答
1

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

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

^https?:\/\/(?!(www\.)?(domain\.com))
于 2013-03-27T16:06:56.483 回答
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>
于 2013-03-27T15:55:12.070 回答