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")
>>>

^^^^^^^^^^^^^^^^^^^^^^这就是失败的地方

vvvvvvvvvvvvvvvvvvvvvv但是如果我没有 ? 在字符串中

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

我也尝试过:

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

但这只是允许它匹配 \ 字符(如预期的那样)。

我的正则表达式有什么问题?

4

2 回答 2

6

\1是一个反向引用,它将匹配被引用组匹配的内容,而不是它可以匹配的内容。如果您想让该模式出现两次,只需写两次:

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

(另请注意,?不需要在字符集中转义。)

于 2013-05-23T23:01:31.253 回答
3

为什么希望'???????,1234567'匹配?显然第二部分 ( ) 与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 个或更多......好吧,这取决于你如何定义它,它要么是 match-everything 重言式,要么是之前包裹在一个 big ?.

于 2013-05-23T23:02:06.497 回答