python、正则表达式、命名组与“逻辑或”运算符

5 投票
1 回答
4499 浏览
提问于 2025-04-15 11:48

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

撰写回答