正则expression式错误 – 没有重复

当我使用这个expression式时,我得到一个错误消息:

re.sub(r"([^\s\w])(\s*\1)+","\\1","...") 

我在RegExr检查正则expression式,它返回. 如预期。 但是,当我在Python中尝试它,我得到这个错误消息:

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

有人可以解释吗?

这似乎是一个Python的bug(在vim中完美的工作)。 问题的根源在于(\ s * …)+位。 基本上,你不能(\s*)+这是有道理的,因为你试图重复一些可以为空的东西。

 >>> re.compile(r"(\s*)+") Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/System/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/re.py", line 180, in compile return _compile(pattern, flags) File "/System/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/re.py", line 233, in _compile raise error, v # invalid expression sre_constants.error: nothing to repeat 

但是(\s*\1)不应该为空,但是我们知道它只是因为我们知道\ 1中的内容。 显然python不…那很奇怪。

这是“*”和特殊字符之间的Python错误。

代替

 re.compile(r"\w*") 

尝试:

 re.compile(r"[a-zA-Z0-9]*") 

它的工作原理,但是不会使正则expression式相同。

这个bug似乎已经被固定在2.7.5和2.7.6之间。

这不仅仅是一个带有*的Python错误,当你传递一个string作为正则expression式的一部分被编译时,它也会发生。

 import re input_line = "string from any input source" processed_line= "text to be edited with {}".format(input_line) target = "text to be searched" re.search(processed_line, target) 

这会导致一个错误,如果处理的行包含一些“(+)”例如,你可以在化学公式或字符链中find。 解决办法是逃跑,但是当你在飞行中这样做的时候,可能会发生你不能正确地做到这一点…

除了被发现和修复的bug之外,我还会注意到错误消息sre_constants.error: nothing to repeat的,有点令人困惑。 我试图用r'?.*'作为一种模式,并认为它是抱怨有关这个*一个奇怪的原因,但是问题其实是那个? 是一种说“重复零次或一次”的方式。 所以我需要说r'\?.*'来匹配文字?