12

在 Python 2.7 和 3 中,以下工作:

>>> re.search(r"a{1,9999}", 'aaa')
<_sre.SRE_Match object at 0x1f5d100>

但这给出了一个错误:

>>> re.search(r"a{1,99999}", 'aaa')
 Traceback (most recent call last):
   File "<stdin>", line 1, in <module>
   File "/usr/lib/python2.7/re.py", line 142, in search
   return _compile(pattern, flags).search(string)
   File "/usr/lib/python2.7/re.py", line 240, in _compile
   p = sre_compile.compile(pattern, flags)
   File "/usr/lib/python2.7/sre_compile.py", line 523, in compile
   groupindex, indexgroup
RuntimeError: invalid SRE code

似乎允许的重复次数有上限。这是正则表达式规范的一部分,还是 Python 特定的限制?如果特定于 Python,实际数字是否记录在某处,并且在实现之间是否有所不同?

4

1 回答 1

14

快速手动二分搜索揭示了答案,特别是 65535:

>>> re.search(r"a{1,65535}", 'aaa')
<_sre.SRE_Match object at 0x2a9a68>
>>> 
>>> re.search(r"a{1,65536}", 'aaa')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Library/Frameworks/Python.framework/Versions/7.3/lib/python2.7/re.py", line 142, in search
    return _compile(pattern, flags).search(string)
  File "/Library/Frameworks/Python.framework/Versions/7.3/lib/python2.7/re.py", line 240, in _compile
    p = sre_compile.compile(pattern, flags)
  File "/Library/Frameworks/Python.framework/Versions/7.3/lib/python2.7/sre_compile.py", line 523, in compile
    groupindex, indexgroup
OverflowError: regular expression code size limit exceeded

这在这里讨论:

限制是一个实现细节。该模式被编译成代码,然后被解释,并且恰好代码是(通常)16位,范围为0..65535,但它使用65535表示没有限制,如果你真的不发出警告写 65535。

量词使用 65535 表示没有上限,因此“.{0,65535}”等价于“.*”。


感谢以下评论的作者指出更多内容:

  • CPython 在_sre.c. (@卢卡斯格拉夫)
  • 有一个常量MAXREPEAT保存sre_constants.py这个最大重复值:

    >>> import sre_constants
    >>> 
    >>> sre_constants.MAXREPEAT
    65535
    

    (@MarkkuK。和@hcwhsa)

于 2013-11-04T17:41:36.040 回答