正则表达式错误 - 无需重复
Posted
技术标签:
【中文标题】正则表达式错误 - 无需重复【英文标题】:regex error - nothing to repeat 【发布时间】:2011-04-10 03:54:02 【问题描述】:我在使用这个表达式时收到一条错误消息:
re.sub(r"([^\s\w])(\s*\1)+","\\1","...")
我检查了RegExr 的正则表达式,它按预期返回.
。但是当我在 Python 中尝试它时,我会收到以下错误消息:
raise error, v # invalid expression
sre_constants.error: nothing to repeat
谁能解释一下?
【问题讨论】:
如果有人因为没有明显原因而收到此错误,请确保创建 virtualenv 时使用的 Python 版本仍与全局安装的解释器版本匹配(例如,旧vritualenv 在将 Python 升级到更新版本之前创建。) @bvukelic 我将如何重新调整以使它们相同? 我刚刚销毁了现有的环境,然后重新创建了它。 这在当前版本的python中已修复,不再抛出异常。见Python Issue18647。 我有一个愚蠢的错误原因,我正在匹配以星号开头的字符序列。转义星号有帮助。在断定已知的 Python 错误导致错误之前,请检查这不是问题。 【参考方案1】:这似乎是一个 python 错误(在 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没有……这很奇怪。
【讨论】:
@alan:是的,我也注意到了。 @goh:我猜你需要分两步来做,首先删除所有重复的东西之间的空格,然后做你以前的东西,但你不再需要 \s* 这导致问题。 谢谢,这帮助我解决了类似的问题。出于某种原因, re.compile(mypattern) 在 Windows 上工作,但不是在 Linux 上工作。去搞清楚。我的问题是我有(。* $)?并且必须将其更改为 (.+$)?【参考方案2】:这是“*”和特殊字符之间的 Python 错误。
代替
re.compile(r"\w*")
试试:
re.compile(r"[a-zA-Z0-9]*")
它可以工作,但不会产生相同的正则表达式。
此错误似乎已在 2.7.5 和 2.7.6 之间修复。
【讨论】:
【参考方案3】:实际上,这不仅是一个带有 * 的 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)
如果处理的行包含一些“(+)”,这将导致错误,例如,您可以在化学公式或此类字符链中找到。 解决方案是逃跑,但是当你在飞行中这样做时,可能会发生你没有正确地做到这一点......
【讨论】:
【参考方案4】:在语言理论中,正则表达式通常使用 * 和 +。 我在执行行代码时遇到了同样的错误
re.split("*",text)
要解决它,需要在*和+之前包含\
re.split("\*",text)
【讨论】:
【参考方案5】:除了发现并修复的错误之外,我只注意到错误消息sre_constants.error: nothing to repeat
有点令人困惑。我试图使用r'?.*'
作为模式,并认为它出于某种奇怪的原因抱怨*
,但问题实际上是?
是一种表示“重复零次或一次”的方式。所以我需要说r'\?.*'
来匹配文字?
【讨论】:
【参考方案6】:我在使用正则表达式\b?
时遇到了这个问题。使用\s?
解决了这个问题(虽然不是一回事)
【讨论】:
以上是关于正则表达式错误 - 无需重复的主要内容,如果未能解决你的问题,请参考以下文章
#1139 - 从正则表达式中得到错误“重复运算符操作数无效”