0

我正在将 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\$\.\+\!\_\*\(\)\/\,\:;@&=\?~#%]*)*/gi.

我搜索了大约nothing to repeat错误,但一无所获。 对不起,这是一个重复的帖子。

问题出在哪里?

4

2 回答 2

10

我用以下方法重现了错误:

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

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

这应该适合你:

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

我刚刚删除了最后一个*.

于 2013-04-11T04:56:36.487 回答
0

如果出现相同的错误,请使用以下正则表达式:

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

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

于 2015-01-27T04:29:07.690 回答