Подтвердить что ты не робот

Какое максимальное количество повторений допускается в регулярном выражении Python?

В 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-specific, это фактическое число, зарегистрированное где-то, и отличается ли оно от реализаций?

4b9b3361

Ответ 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)