Страницы

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

понедельник, 12 ноября 2018 г.

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

У меня есть очень длинные регулярные выражения с большим количеством групп внутри. Например,такие
((ab+)|(qwe[rty]?)|(hjk.*)|(mmm)|(ppp)|(sss))? ((ooo[0-9]?)|(ddd)|(ggg)|(jjj))kk? zzz
только длиной в 1-2 тысячи символов и с 100-200 групп и подгрупп. Есть ли в python какие-то ограничения на длину регулярного выражения? На количество групп в нем? Еще какие-то нюансы? Или же ограничений нет вообще, и все зависит только от мощности процессора?
Пока кажется, что я не могу использовать регулярные выражения длиной более 1000 символов и/или с более, чем 100 группами.


Ответ

Судя по этому тикету в 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
Я бы все-таки посоветовал бы вам открыть новый вопрос и описать вашу задачу с примерами входного и "выходного" текста / данных - возможно существует более элегантное решение...

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

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