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

moj*_*nes 12 python regex

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

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

但这会给出一个错误:

>>> 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
Run Code Online (Sandbox Code Playgroud)

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

ars*_*jii 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
Run Code Online (Sandbox Code Playgroud)

这在这里讨论:

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

量词使用65535表示无上限,因此".{0,65535}"等同于".*".


感谢下面评论的作者指出了一些更多的东西:

  • 另外,如果你查看sre_constants.py,你会发现`MAXREPEAT = 65535` (3认同)
  • 请注意,`sre_constants.MAXREPEAT`不一定是非CPython实现中的限制.在`PyPy 2.0.0-beta1上测试`len(re.search(r"a {1,999999}","a"*(2*10**6)).group())== 999999`成功,`Jython 2.5.1 +`和`IronPython 2.9.9a0`.尽管`pypy`和`jython`都有`sre_constants.MAXREPEAT == 65535`,但这仍然有效. (2认同)