我在Python的re模块中发现了一个无法解释的问题。编译(a*)*
或(a*|b)*
会抛出错误:
raise error, v # invalid expression sre_constants.error: nothing to repeat
我已经在javascript中测试了这个正则表达式,它似乎没有问题。
这是一个bug吗?
a*
没有匹配项,它就不知道如何捕获0个或更多的“空”。Python中的一个问题。
http://bugs.python.org/issue2537
http://bugs.python.org/issue214033
也许“问题”不是这里正确的词。有不同的解释方式...
a*
可以为 null,导致 (null)*
,这对解释器来说没有意义。(a*|b)
也可以为 null,因为它可以被解释成 (b)
或者 (a*)
。你可以使用 (a+)*
,因此使用 (a+|b)*
Python 拒绝使用 (a*)*
和 (a*|b)*
,实际上有一个重要的原因。由于 *
是贪婪的,它会匹配最长的字符串。问题在于,如果被 *
修改的正则表达式为空,则正则表达式解析器会尝试匹配尽可能多的空字符串重复。这意味着它将匹配您测试的字符串中任意两个字符之间的任意数量的空字符串。由于 a*
在捕获组中,它必须捕获所有这些空字符串,这是不可能的。
这似乎是一个Python问题,请参见 http://bugs.python.org/issue214033
此外,它也在StackO上出现了 regex error - nothing to repeat
(a*)*
和a*
是相同的,(a*|b)*
和[ab]*
(或(a|b)*
)是相同的。出于好奇,是否有一个好的用例呢? - Kobi+
而不是*
。 - theheadofabroom