python、正则表达式、命名组与“逻辑或”运算符
在Python的正则表达式中,有名字的组和没有名字的组都是用'('和')'来定义的。这就导致了一些奇怪的行为。比如说,下面这个正则表达式:
"(?P<a>1)=(?P<b>2)"
用在文本"1=2"上时,会找到名字为"a"的组,值是"1",还有名字为"b"的组,值是"2"。但是如果我想用“逻辑或”操作符,把多个规则连接起来,下面这个正则表达式:
"((?P<a>1)=(?P<b>2))|(?P<c>3)"
同样用在文本"1=2"上时,会找到一个没有名字的组,值是"1=2"。我明白正则表达式引擎把包含组"a"和"b"的'('和')'当作一个没有名字的组来处理,并且报告找到了这个组。但我并不想要这个没有名字的组被报告,我只是想用“|”来把多个正则表达式连接在一起,而不想产生任何多余的没有名字的组。有没有办法在Python中做到这一点呢?
1 个回答
15
使用 (?:)
可以去掉没有名字的分组:
r"(?:(?P<a>1)=(?P<b>2))|(?P<c>3)"
根据re的文档:
(?:...) 是一种不进行分组的普通括号。它会匹配括号内的正则表达式,但匹配到的内容无法在匹配后提取出来,也不能在模式中后续引用。
顺便提一下,或运算符 |
的优先级非常低,这样在像你这种情况下就不需要额外的括号。你可以去掉正则表达式中的多余括号,它仍然会按预期工作:
r"(?P<a>1)=(?P<b>2)|(?P<c>3)"