在Python中使用or运算符捕获组

时间:2019-05-03 05:01:07

标签: python regex

我发现在Python 3.7.0中,当一个分支最初匹配但使用或运算符捕获组时会出现奇怪的行为,但是正则表达式最终必须回溯并使用另一个分支。在这种情况下,即使正则表达式使用第二个分支,捕获组仍会保留第一个分支。

示例代码:

regexString = "^(a)|(ab)$"

captureString = "ab"

match = re.match(regexString, captureString)

print(match.groups())

输出:

('a', None)

第二个组是使用的组,但是第一个组被捕获而第二个组没有被捕获。

有趣的是,我找到了一种解决方法,方法是在两个组之间添加非捕获括号,如下所示:

regexString = "^(?:(a)|(ab))$"

新输出:

(None, 'ab')

在我看来,这种行为似乎是一个错误。如果不是这样,有人可以向我指出一些说明为什么发生这种情况的文档吗?谢谢!

1 个答案:

答案 0 :(得分:6)

这是一个常见的正则表达式错误。这是您的原始模式:

^(a)|(ab)$

这实际上是说要匹配^a,即在输入 a,即ab$的开始处匹配ab输入。如果您想匹配aab作为整个输入,那么您发现您需要:

^(?:(a)|(ab))$

要进一步使自己相信这种行为,可以验证以下模式与原始模式是否匹配:

(ab)$|^(a)

也就是说,每个交替的术语都是独立的,并且位置甚至无关紧要,至少在哪些输入将匹配或不匹配方面。顺便说一下,您本可以使用以下模式:

^ab?$

这将匹配aab,而且您甚至不需要捕获组,因为整个匹配将与您想要的相对应。