正则表达式错误-无需重复


74

使用此表达式时出现错误消息:

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

我在RegExr中检查了正则表达式,它.按预期返回。但是当我在Python中尝试时,出现以下错误消息:

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

有人可以解释一下吗?


3
如果有人无故收到此错误,请确保创建virtualenv时使用的Python版本仍与全局安装的解释器版本匹配(例如,在将Python升级到较新版本之前创建的旧vritualenv。)

@bvukelic我将如何重新调整以使它们相同?
戴夫·刘

我只是销毁了现有的env,然后重新创建了它。

1
这已在当前版本的python中修复,并且不再引发异常。参见Python Issue18647
阿米尔·阿里·阿克巴里

1
我有一个愚蠢的错误原因,我匹配一个以星号开头的字符序列。转义星号有帮助。在确定已知的Python错误已引起该错误之前,请检查这不是问题。
Kevin Lee

Answers:


49

这似乎是一个python错误(在vim中完美运行)。问题的根源是(\ s * ...)+位。基本上,您无法做到(\s*)+这一点,因为您正在尝试重复可能为null的内容。

>>> 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)不应该为null,而是仅因为我们知道\ 1中的内容而知道它。显然python并不...这很奇怪。


@alan:是的,我也注意到了。
2010年

@goh:我想您需要分两个步骤进行操作,首先删除indenticals东西之间的所有空格,然后再做以前的东西,但您不再需要\ s *会引起问题。
2010年

谢谢,这帮助我找出了类似的问题。出于某种原因,re.compile(mypattern)在Windows上有效,但在linux上无效。去搞清楚。我的问题是我有(。* $)吗?并不得不将其更改为(。+ $)?
艾琳2013年

18

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

代替

re.compile(r"\w*")

尝试:

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

它可以工作,但是不能使用相同的正则表达式。

该错误似乎已在2.7.5和2.7.6之间修复。


7

实际上,这不仅是带有*的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)

如果处理过的行包含一些“(+)”(例如,您可以在化学式中找到)或此类字符链,则将导致错误。解决方案是逃脱,但是当您即时进行操作时,可能会发生无法正确执行操作的情况...


5

除了已发现并已修复的错误之外,我只注意到错误消息sre_constants.error: nothing to repeat有点令人困惑。我试图将其r'?.*'用作一种模式,并认为它是出于某种奇怪的原因而抱怨的*,但问题实际上是这?是“重复零次或一次”的一种方式。所以我需要说r'\?.*'匹配字面量?


3

正则表达式通常在语言理论中使用*和+。执行行代码时遇到相同的错误

re.split("*",text)

要解决它,它需要在*和+之前包含\

re.split("\*",text)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.