1

質問があります。そのようなパターンがあるとしましょう:

>>> import re
>>> pt ='^a{1,2}$'
>>> re.search(pt, 'aa') # looks ok
<_sre.SRE_Match object at 0x020B2288>
>>> re.search(pt, 'aaa') # ok too
>>>

次に、別のパターンとの一致を探してみましょう。

>>> pt = '^a{1,2}|x$'
>>> re.search(pt, 'a') # this one looks ok
<_sre.SRE_Match object at 0x020B25D0>
>>> re.search(pt, 'aaax') # (1) Now this one?
<_sre.SRE_Match object at 0x020B2288>
>>> re.search(pt, 'aaaaaax') # (2) and this one?
<_sre.SRE_Match object at 0x020B25D0>
>>> re.search(pt, 'aaa') # (3) and this one?
<_sre.SRE_Match object at 0x020B25D0>

(1)(2)(3)私には、1つまたは2つの「a」または1つの「x」、あるいは両方の組み合わせで始まり、これらの文字の間で終わる文字列と一致する必要があるように見えますが、それ以外は何もありません。それとも私はそれを何かを得られませんか?そんなはず?'|'を使用する場合と同様に、{}内に設定されている制限を無視しますか?誰かが私にこれを説明できますか?

4

2 に答える 2

2

はグループ化の$影響を受けます。正規表現は として解釈され(^a{1,2})|(x$)、「文字列の先頭にある 1 つまたは 2 つ」または「文字列の末尾にある x」のいずれかに一致します。as と xs のみに適用する場合は、|それらをグループ化する必要があります。

pt = '^(a{1,2}|x)$'

または、グループをキャプチャしたくない場合は、非キャプチャ グループを使用します。

pt = '^(?:a{1,2}|x)$'

編集:あなたが何を一致させようとしているのか理解できませんが、おそらく試してください:

pt = '^(a{1,2}x?|x)$"
于 2012-12-13T19:10:58.537 に答える
2

^foo|bar$ matches ^foo or bar$.

于 2012-12-13T19:11:40.477 に答える