Страницы

Поиск по вопросам

суббота, 21 декабря 2019 г.

Есть ли в python ограничения на длину регулярных выражений?

#python #регулярные_выражения


У меня есть очень длинные регулярные выражения с большим количеством групп внутри.
Например,такие

((ab+)|(qwe[rty]?)|(hjk.*)|(mmm)|(ppp)|(sss))? ((ooo[0-9]?)|(ddd)|(ggg)|(jjj))kk? zzz


только длиной в 1-2 тысячи символов и с 100-200 групп и подгрупп. 
Есть ли в python какие-то ограничения на длину регулярного выражения? На количество
групп в нем? Еще какие-то нюансы? Или же ограничений нет вообще, и все зависит только
от мощности процессора?

Пока кажется, что я не могу использовать регулярные выражения длиной более 1000 символов
и/или с более, чем 100 группами. 
    


Ответы

Ответ 1



Судя по этому тикету в Python до версии 3.5 есть ограничение в 100 групп (capturing groups). https://bugs.python.org/file36654/re_maxgroups.patch: -``(?P=name)`` - A backreference to a named group; it matches whatever text was matched by the - earlier group named *name*. +``(?P=name)``, ``(?P=number)`` + A backreference to a group; it matches whatever text was matched by the + earlier group named *name* or numbered *number*. + + .. versionchanged:: 3.5 + Added support of group numbers. ``(?#...)`` A comment; the contents of the parentheses are simply ignored. diff -r 8a2755f6ae96 Lib/sre_compile.py --- a/Lib/sre_compile.py Thu Sep 18 19:45:04 2014 +0300 +++ b/Lib/sre_compile.py Thu Sep 18 23:27:28 2014 +0300 @@ -470,12 +470,6 @@ def compile(p, flags=0): # print code - # XXX: get rid of this limitation! - if p.pattern.groups > 100: - raise AssertionError( - "sorry, but this version only supports 100 named groups" - ) - # map in either direction groupindex = p.pattern.groupdict indexgroup = [None] * p.pattern.groups Я бы все-таки посоветовал бы вам открыть новый вопрос и описать вашу задачу с примерами входного и "выходного" текста / данных - возможно существует более элегантное решение...

Ответ 2



Предположу, что Вам не нужно такое количество СОХРАНЯЮЩИХ групп. Скорее всего их все можно заменить на НЕ сохраняющие (?:...). Вы используете «склейщик» регулярных выражений, который склеивает не правильно- группы не должны быть сохраняющими, так как в этом нет никакого смысла, кроме сокращения на два символа на каждую группу (нет ?:).

Комментариев нет:

Отправить комментарий