【问题标题】:Python can not compile that regex. sre_constants.error: nothing to repeat [duplicate]Python 无法编译该正则表达式。 sre_constants.error:没有什么可重复的[重复]
【发布时间】:2013-04-03 04:30:31
【问题描述】:

我正在将 C# 函数转换为 Python。它应该是与现有功能兼容的错误。

这是该函数中的正则表达式:http://[a-zA-Z0-9]+(\.[a-zA-Z0-9]+)+([-A-Z0-9a-z_$.+!*()/\\\,:;@&=?~#%]*)*。但是Python编译不出来:

>>> re.compile(r"http://[a-zA-Z0-9]+(\.[a-zA-Z0-9]+)+([-A-Z0-9a-z_$.+!*()/\\\,:;@&=?~#%]*)*")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python3.3/re.py", line 214, in compile
    return _compile(pattern, flags)
  File "/usr/lib/python3.3/re.py", line 281, in _compile
    p = sre_compile.compile(pattern, flags)
  File "/usr/lib/python3.3/sre_compile.py", line 498, in compile
    code = _code(p, flags)
  File "/usr/lib/python3.3/sre_compile.py", line 483, in _code
    _compile(code, p.data, flags)
  File "/usr/lib/python3.3/sre_compile.py", line 75, in _compile
    elif _simple(av) and op is not REPEAT:
  File "/usr/lib/python3.3/sre_compile.py", line 362, in _simple
    raise error("nothing to repeat")
sre_constants.error: nothing to repeat

注意:该正则表达式有一个 JavaScript 版本:/http:\/\/[a-zA-Z0-9]+(\.[a-zA-Z0-9]+)+([-A-Z0-9a-z\$\.\+\!\_\*\(\)\/\,\:;@&amp;=\?~#%]*)*/gi

我搜索了 nothing to repeat 错误,但什么也没找到。 抱歉,这是重复的帖子。

问题出在哪里?

【问题讨论】:

  • “我没有搜索任何可重复的错误,但一无所获。” Really? 看起来有很多有意义的结果,包括其他评论者发现的另外两个 SO 问题。

标签: python regex


【解决方案1】:

遇到同样的错误,下面的正则表达式:

re.compile(r'(?P<term>[0-9]{1,2})-(?P<features>[A-Za-z\:]*)?')

是“?”最后导致错误。严格来说,这不是重复,事实上,从 python 2.7.9 开始,它就可以正常工作(应该如此)。但是,该错误从 python 2.7.3 开始存在。

【讨论】:

    【解决方案2】:

    我已经重现了错误:

    re.compile(r"([A]*)*")
    

    问题是[A]* 可能匹配一个空字符串。猜猜当[A]* 为空时它尝试匹配([A]*)* 会发生什么? “没有什么可重复的”。不过,正则表达式引擎不会等待实际发生。它失败了,因为这种情况甚至有可能发生。

    这应该适合你:

    r"http://[a-zA-Z0-9]+(\.[a-zA-Z0-9]+)+([-A-Z0-9a-z_$.+!*()/\\\,:;@&=?~#%]*)"
    

    我刚刚删除了最后一个*

    【讨论】:

    • 谢谢,我现在明白了。因此,许多正则表达式引擎会忽略该错误,但 Python 会引发错误。
    猜你喜欢
    • 1970-01-01
    • 2020-10-17
    • 1970-01-01
    • 2018-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-03
    相关资源
    最近更新 更多