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 に答える