首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >什么时候Python regex会失败?参与重复组

什么时候Python regex会失败?参与重复组
EN

Stack Overflow用户
提问于 2013-05-24 06:57:07
回答 2查看 74关注 0票数 2

尝试匹配任意数量的逗号分隔的7个字符串,这些字符串可以包含数字、_和?

代码语言:javascript
复制
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重复工作吗?在字符串中

代码语言:javascript
复制
>>> x.match("1234567,1234567")
<_sre.SRE_Match object at 0x023483C8>

我也尝试过这样做:

代码语言:javascript
复制
x = re.compile(r"^([0-9_\\?]{7})(,\1)*$")

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-05-24 07:01:31

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

代码语言:javascript
复制
r"^([0-9_?]{7})(,[0-9_?]{7})*$"

(还要注意,?不需要在字符集内进行转义。)

票数 6
EN

Stack Overflow用户

发布于 2013-05-24 07:02:06

为什么您希望'???????,1234567'匹配?显然,第二部分(1234567)与\1反向引用(???????)不匹配。

如果不使用任何?字符,也会遇到同样的问题:

代码语言:javascript
复制
>>> x = re.compile(r"^([0-9_\?]{7})(,\1)*$")
>>> x.match('1234567,1234568')

这将返回None。但是:

代码语言:javascript
复制
>>> x.match('???????,???????')
<_sre.SRE_Match at 0x104208140>

因此,整个?问题完全无关紧要。(您实际上不应该转义问号;您不希望在字符类中这样做。但这不是你的问题。)

如果您想要匹配同一事物的1个或多个逗号分隔的副本,则需要匹配一个不带逗号的副本,加上0个或更多个前面的逗号,如下所示:

代码语言:javascript
复制
>>> x = re.compile(r"^([0-9_?]{7})(,([0-9_?]{7}))*$")

如果您想匹配0个或更多…好吧,取决于你如何定义它,它要么是一个万物匹配的重言式,要么是前一个包装在一个大的?中。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16725226

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档