[英]Capturing groups with an or operator in Python
当一个分支最初匹配但正则表达式必须最终回溯并使用不同的分支时,我在Python 3.7.0中发现了使用或运算符捕获组时的奇怪行为。 在这种情况下,即使正则表达式使用第二个分支,捕获组也会坚持使用第一个分支。
示例代码:
regexString = "^(a)|(ab)$"
captureString = "ab"
match = re.match(regexString, captureString)
print(match.groups())
输出:
('a', None)
第二组是使用的组,但第一组被捕获而第二组不被捕获。
有趣的是,我通过在两个组周围添加非捕获括号来找到一种解决方法,如下所示:
regexString = "^(?:(a)|(ab))$"
新产出:
(None, 'ab')
对我来说,这种行为看起来像一个bug。 如果不是,有人可以给我一些文件解释为什么会这样吗? 谢谢!
这是一个常见的正则表达式错误。 这是您的原始模式:
^(a)|(ab)$
这实际上说来匹配^a
,即a
在输入或开始ab$
,即ab
在输入的结束。 如果您想要匹配a
或ab
作为整个输入,那么当你想出来时,你需要:
^(?:(a)|(ab))$
为了进一步说服自己这种行为,您可以验证以下模式是否与原始模式相同:
(ab)$|^(a)
也就是说,每个交替的术语是分开的,并且该位置甚至不重要,至少关于哪些输入匹配或不匹配。 顺便说一句,您可能刚刚使用了以下模式:
^ab?$
这将匹配a
或ab
,你甚至不需要捕获组,因为整个匹配将对应于你想要的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.