在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,是否在某处记录了实际数字,并且它在实现之间是否有所不同?
答案 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}”相当于“。*”。
感谢下面评论的作者指出了更多的内容:
_sre.c
中实现了此限制。 (@LukasGraf) sre_constants.py
中的常量MAXREPEAT
保留了此最大重复值:
>>> import sre_constants
>>>
>>> sre_constants.MAXREPEAT
65535
(@ MarkkuK。和@hcwhsa)