Ответ 1
Быстрый ручной бинарный поиск показал ответ, в частности 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
. (@LukasGraf) -
В
sre_constants.py
есть константаMAXREPEAT
, которая содержит это максимальное значение повторения:>>> import sre_constants >>> >>> sre_constants.MAXREPEAT 65535
(@MarkkuK. и @hcwhsa)