尝试匹配任意数量的逗号分隔的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")
>>>^^这就是它失败的地方
如果我没有一个? vvvvvvvvvvvvvvvvvvvvvvBut重复工作吗?在字符串中
>>> x.match("1234567,1234567")
<_sre.SRE_Match object at 0x023483C8>我也尝试过这样做:
x = re.compile(r"^([0-9_\\?]{7})(,\1)*$")但这只是允许它匹配\字符(正如预期的那样)。
我的正则表达式有什么问题?
发布于 2013-05-24 07:01:31
\1是一个反向引用,它将匹配被引用组匹配的内容,而不是它可以匹配的内容。如果您想让该模式出现两次,只需编写两次:
r"^([0-9_?]{7})(,[0-9_?]{7})*$"(还要注意,?不需要在字符集内进行转义。)
发布于 2013-05-24 07:02:06
为什么您希望'???????,1234567'匹配?显然,第二部分(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个或更多…好吧,取决于你如何定义它,它要么是一个万物匹配的重言式,要么是前一个包装在一个大的?中。
https://stackoverflow.com/questions/16725226
复制相似问题