正则表达式错误 - 没有可重复的项

96 投票
6 回答
209322 浏览
提问于 2025-04-16 03:54

我在使用这个表达式的时候遇到了一个错误信息:

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

我在 RegExr 上检查了这个正则表达式,它返回了 .,这正是我期待的结果。但是当我在Python中尝试时,却收到了这个错误信息:

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

有人能帮我解释一下吗?

相关问题:

6 个回答

13

这不仅仅是Python的一个错误,其实当你把一个字符串作为正则表达式的一部分传进去编译时,也可能会出现这个问题,比如说;

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)

如果处理的行里面包含了一些像"(+)"这样的内容,比如在化学公式中常见的,或者其他类似的字符组合,就会导致错误。解决这个问题的方法是进行转义,但如果你在处理的过程中临时转义,可能会出现转义不正确的情况……

23

这是一个关于Python在“*”和特殊字符之间的错误。

不要用

re.compile(r"\w*")

试试:

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

这样可以工作,但生成的正则表达式不一样。

这个错误似乎在2.7.5和2.7.6之间已经修复了。

59

这似乎是个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并没有这样处理……这真是奇怪。

撰写回答