2

数字、_ および ? を含む、コンマで区切られた 7 文字の任意の数の文字列との一致を試みます。

x = re.compile(r"^([0-9_\?]{7})(,\1)*$")

>>> x.match("123456?")
<_sre.SRE_Match object at 0x0046C800>
>>> x.match("12345??")
<_sre.SRE_Match object at 0x023483C8>
>>> x.match("1234???")
<_sre.SRE_Match object at 0x0046C800>
>>> x.match("123????")
<_sre.SRE_Match object at 0x023483C8>
>>> x.match("12?????")
<_sre.SRE_Match object at 0x0046C800>
>>> x.match("1??????")
<_sre.SRE_Match object at 0x023483C8>
>>> x.match("???????")
<_sre.SRE_Match object at 0x0046C800>
>>> x.match("???????,1234567")
>>>

^^^^^^^^^^^^^^^^^^^^^^^^ここが失敗です

vvvvvvvvvvvvvvvvvvvvvしかし、? がない場合は繰り返しが機能します。文字列で

>>> x.match("1234567,1234567")
<_sre.SRE_Match object at 0x023483C8>

私も試してみました:

x = re.compile(r"^([0-9_\\?]{7})(,\1)*$")

しかし、それは \ 文字に一致することを可能にします (予想どおり)。

私の正規表現の何が問題になっていますか?

4

2 に答える 2

6

\1一致できるものではなく、参照されたグループが一致したものと一致する後方参照です。そのパターンを 2 回出現させたい場合は、2 回書くだけです。

r"^([0-9_?]{7})(,[0-9_?]{7})*$"

?(文字セット内でエスケープする必要がないことにも注意してください。)

于 2013-05-23T23:01:31.253 に答える
3

なぜ'???????,1234567'一致することを期待するのですか?明らかに、2 番目の部分 ( ) はbackref ( )1234567と一致しません。\1???????

?文字がなくても同じ問題が発生します。

>>> x = re.compile(r"^([0-9_\?]{7})(,\1)*$")
>>> x.match('1234567,1234568')

これは を返しますNone。しかし:

>>> x.match('???????,???????')
<_sre.SRE_Match at 0x104208140>

したがって、?問題全体はまったく無関係です。(実際には、疑問符をエスケープするべきではありません。文字クラス内でエスケープしたくありません。しかし、それは問題ではありません。)

同じもののカンマ区切りのコピーを 1 つ以上一致させたい場合は、次のように、カンマなしのコピーに加えて、前にコンマを付けて 0 以上を一致させる必要があります。

>>> x = re.compile(r"^([0-9_?]{7})(,([0-9_?]{7}))*$")

0 個以上に一致させたい場合は…まあ、それをどのように定義するかに応じて、すべてに一致するトートロジーか、大きな?.

于 2013-05-23T23:02:06.497 に答える