Python正则表达式的奇怪行为

9

我在Python的re模块中发现了一个无法解释的问题。编译(a*)*(a*|b)*会抛出错误:

raise error, v # invalid expression sre_constants.error: nothing to repeat

我已经在javascript中测试了这个正则表达式,它似乎没有问题。

这是一个bug吗?


2
相关链接:https://dev59.com/fnA65IYBdhLWcg3wsw8X - Kobi
1
我想补充一点:从逻辑上讲,这些都没有意义。(a*)*a* 是相同的,(a*|b)*[ab]*(或 (a|b)*)是相同的。出于好奇,是否有一个好的用例呢? - Kobi
@Kobi 或许如果使用贪婪匹配,你可以尽可能地匹配长字符串但较少的实例 - 但是为此你需要使用 + 而不是 * - theheadofabroom
5个回答

9
是的,这是一个错误(或者至少是一个不好的功能)。它在抱怨如果a*没有匹配项,它就不知道如何捕获0个或更多的“空”。

5

1
哇!我在生命中第一次发现了Python的一个bug =) - f0b0s

5

a* 可以为 null,导致 (null)*,这对解释器来说没有意义。(a*|b) 也可以为 null,因为它可以被解释成 (b) 或者 (a*)。你可以使用 (a+)*,因此使用 (a+|b)*


我完全同意你的观点,但无论如何Mu Mind是正确的。 - f0b0s
@f0b0s,本质上,@Mu和我说的是同样的事情——唯一的区别在于表述方式——这就是为什么我会给他点赞的原因。 - theheadofabroom
我还是不明白。如果不能重复 null 是一种特性,那么为什么 (a?)* 是有效的呢?它也可以给出 (null)*。 - Wang
@Wang 我不知道为什么 (a?)* 会是有效的,从逻辑上看它似乎不应该是这样。 - theheadofabroom
这是一个修复了的 bug 的回退。最近又被修复了。哎呀!Python... - Wang

1

Python 拒绝使用 (a*)*(a*|b)*,实际上有一个重要的原因。由于 * 是贪婪的,它会匹配最长的字符串。问题在于,如果被 * 修改的正则表达式为空,则正则表达式解析器会尝试匹配尽可能多的空字符串重复。这意味着它将匹配您测试的字符串中任意两个字符之间的任意数量的空字符串。由于 a* 在捕获组中,它必须捕获所有这些空字符串,这是不可能的。


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接