0

Python にバグがあるようです: (Python 2.7.3 (デフォルト、2012 年 4 月 10 日、23:24:47) [MSC v.1500 64 ビット (AMD64)] on win32)

>>> re.match("0[5-7][5-9][0-9]{7}", "0775123456") #match
<_sre.SRE_Match object at 0x0000000002D3FC60>

>>> re.match("0[5-7][5-9][0-9]{7}", "077512345") #dont match

>>> re.match("0[5-7][5-9][0-9]{7}", "07751234567") #match!
<_sre.SRE_Match object at 0x0000000002D3F920>

>>> re.match("0[5-7][5-9][0-9]{7}","07751234567777777777777777777777777777777777777777777777") #match!!
<_sre.SRE_Match object at 0x0000000002D3FC60>

したがって、ドル記号を使用して数値を「正確に」制限する必要があります。HTML5検証では、{7}は「正確に」7桁を意味し、ここではPythonでは「少なくとも」を意味するようで、ドル記号を使用して動作する方法は次のとおりです。

>>> re.match("0[5-7][5-9][0-9]{7}$", "0775123456") #match
<_sre.SRE_Match object at 0x0000000002D3F920>

>>> re.match("0[5-7][5-9][0-9]{7}$", "07751234567") #dont match

>>> re.match("0[5-7][5-9][0-9]{7}$", "077512345") #dont match

これは、正確な数字の一致だけでなく、他のすべての正規表現でも発生し、ドルを追加する必要があります!

それはバグですか?それとも設計によるものですか?

4

3 に答える 3

4

これは仕様によるものです。re.matchは、文字列内の任意の場所に一致する とは対照的に、文字列の先頭に一致しre.searchます。文字列の後の余分な文字は無視されます。詳細については、 http://docs.python.org/library/re.html#matchを参照してください。

grep や perl など、正規表現を使用する他の言語も同じように動作します。正規表現は、主にテキストの検索に使用されます。

完全一致を実行したい場合は、あなた自身も指摘したようにドル記号を指定する必要があります。

于 2012-09-14T22:53:57.113 に答える
2

他の人が言ったように...バグではありませんが、あなたの正規表現は「$」がそれを修正しているように見える理由を明確にしませんが、この例は次のようにする必要があります:

import re

print 'food: ',
print re.match('fo{2}d', 'food')     # match found!

print 'fooood: ',
print re.match('fo{2}d', 'fooood')   # no match!

文字列を数字の後{}に終了させたい場合は、そこに追加するのが$適切です。

于 2012-09-14T22:56:37.483 に答える
2

状態のドキュメントre.match():

文字列の先頭にある0 個以上の文字が正規表現パターンに一致する場合…</p>

(私のものを強調してください。)

これは、一致が完了した後の文字列内のすべての文字が無視されることを意味します。たとえば、以下も機能します。

>>> re.match("0[5-7][5-9][0-9]{7}", "0775123456abc")
<_sre.SRE_Match at 0x10ee2e8b8>

正規表現は、一致をアンカーする必要がある場所を指定しません。たとえば、Python にはre.search()、デフォルトでどちらも最初に固定されていないものもあります。^およびメタキャラクタを使用して、アンカーを明示的に指定することができます$

于 2012-09-14T22:54:43.193 に答える