Python正则表达式允许的最大重复次数是多少?

时间:2013-11-04 17:35:32

标签: python regex

在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,是否在某处记录了实际数字,并且它在实现之间是否有所不同?

1 个答案:

答案 0 :(得分: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

讨论here

  

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

  

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


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

  • CPython在_sre.c中实现了此限制。 (@LukasGraf)
  • sre_constants.py中的常量MAXREPEAT保留了此最大重复值:

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

    (@ MarkkuK。和@hcwhsa)