Как преодолеть ограничение глубины регулярных выражений в Python? - PullRequest
0 голосов
/ 04 декабря 2018

Я пытаюсь использовать довольно и запутанные регулярные выражения.Проверяя мои результаты, я увидел, что некоторые из моих более длинных скомпилированных шаблонов были обрезаны - особенно до длины 200.

Это вызвало у меня интерес, и я обнаружил , что 200 является пределом глубины вSAS:

Максимальное количество поднаборов захвата составляет 65535, а максимальная глубина вложенности всех подшаблонов, как захвата, так и не захвата, составляет 200.

Iне удалось найти цитату, подтверждающую, что это так в Python, но, похоже, это основано на моем опыте - и может быть логично предположить, что тот факт, что это точное числовое ограничение существует в механизме регулярных выражений SAS, указывает на то, что некоторые по умолчаниюcap также существует в python.

Была ли эта cap определена?И как я могу преодолеть это и определить мою собственную шапку?Я не смог найти это в документации по python-3.

Пример:

import re
a="""'AAAAAAAAAAAAAAAAAAA\\ \\-\\ AAAAAAA\\ AAAAAAAAAAAA\\ AAAAAAA\\ AAAA\\ AAAAAAAAAAAAAA\\=".*"\\,\\ AAAAAAAAAA\\="AAAAAAAAAA\\:\\ \'AAAAAAAAAAA0\'\\,\\ AAA\\:\\ \'.*\'\\,\\ AAAAAAA.*AAAAAAA.*CCCC\\:\\ \'BBBBBBBBBBBBB\'\\,\\ BBBBBBBBBBBBBBBB\\:\\ \'\'\\,\\ BBBBB\\:\\ \'\'\\,\\ BBBBBBB\\:\\ \'BBBBBBBBBBB\'\''
"""
b=re.compile(a)
print (a)
print (b)

Отпечатки:

'AAAAAAAAAAAAAAAAAAA\ \-\ AAAAAAA\ AAAAAAAAAAAA\ AAAAAAA\ AAAA\ AAAAAAAAAAAAAA\=".*"\,\ AAAAAAAAAA\="AAAAAAAAAA\:\ 'AAAAAAAAAAA0'\,\ AAA\:\ '.*'\,\ AAAAAAA.*AAAAAAA.*CCCC\:\ 'BBBBBBBBBBBBB'\,\ BBBBBBBBBBBBBBBB\:\ ''\,\ BBBBB\:\ ''\,\ BBBBBBB\:\ 'BBBBBBBBBBB'''

и

re.compile('\'AAAAAAAAAAAAAAAAAAA\\ \\-\\ AAAAAAA\\ AAAAAAAAAAAA\\ AAAAAAA\\ AAAA\\ AAAAAAAAAAAAAA\\=".*"\\,\\ AAAAAAAAAA\\="AAAAAAAAAA\\:\\ \'AAAAAAAAAAA0\'\\,\\ AAA\\:\\ \'.*\'\\,\\ AAAAAAA.*AAAAAAA.*CCCC\\:\\)

Регулярное выражение обрезается сразу после "C" sв этом примере перед буквой "B".

Размер внутренней части скомпилированного регулярного выражения,

'\'AAAAAAAAAAAAAAAAAAA\\ \\-\\ AAAAAAA\\ AAAAAAAAAAAA\\ AAAAAAA\\ AAAA\\ AAAAAAAAAAAAAA\\=".*"\\,\\ AAAAAAAAAA\\="AAAAAAAAAA\\:\\ \'AAAAAAAAAAA0\'\\,\\ AAA\\:\\ \'.*\'\\,\\ AAAAAAA.*AAAAAAA.*CCCC\\:\\

- ровно 200.

Редактирование после ответа: как писал user2357112, соответствие не изменяется.

import re
a="""'AAAAAAAAAAAAAAAAAAA22 22-22 AAAAAAA22 AAAAAAAAAAAA22 AAAAAAA22 AAAA22 AAAAAAAAAAAAAA22=".*"22,22 AAAAAAAAAA22="AAAAAAAAAA22:22 2'AAAAAAAAAAA02'22,22 AAA22:22 2'.*2'22,22 AAAAAAA.*AAAAAAA.*CCCC22:22 2'BBBBBBBBBBBBB2'22,22 BBBBBBBBBBBBBBBB22:22 2'2'22,22 BBBBB22:22 2'2'22,22 BBBBBBB22:22 2'BBBBBBBBBBB2'2''
"""
b=re.compile(a)

x="""'AAAAAAAAAAAAAAAAAAA22 22-22 AAAAAAA22 AAAAAAAAAAAA22 AAAAAAA22 AAAA22 AAAAAAAAAAAAAA22="777"22,22 AAAAAAAAAA22="AAAAAAAAAA22:22 2'AAAAAAAAAAA02'22,22 AAA22:22 2'7772'22,22 AAAAAAA777AAAAAAA777CCCC22:22 2'BBBBBBBBBBBBB2'22,22 BBBBBBBBBBBBBBBB22:22 2'2'22,22 BBBBB22:22 2'2'22,22 BBBBBBB22:22 2'BBBBBBBBBBB2'2''
"""

y="""'AAAAAAAAAAAAAAAAAAA22 22-22 AAAAAAA22 AAAAAAAAAAAA22 AAAAAAA22 AAAA22 AAAAAAAAAAAAAA22="777"22,22 AAAAAAAAAA22="AAAAAAAAAA22:22 2'AAAAAAAAAAA02'22,22 AAA22:22 2'7772'22,22 AAAAAAA777AAAAAAA777CCCC22:22 2'BBBBBBBBBBBBB2'22,22 BBBBBBBBBBBBBBBB22:22 2'2'22,22 BBBBB22:22 2'2'22,22 BBBBBBB22:22 2'BBBBBBBBBDD2'2''
"""

if (b.fullmatch(x)):
    print ("x matched!")

if (b.fullmatch(y)):
    print ("y matched!")

Это действительно соответствует только x, а не y, даже если разница между ними не та часть, которая отображается при печати регулярного выражения.

1 Ответ

0 голосов
/ 04 декабря 2018

Это артефакт __repr__ объекта шаблона, который по какой-то причине усекает repr базовой строки шаблона до 200 символов:

result = PyUnicode_FromFormat("re.compile(%.200R)", obj->pattern);

Это не 'T влияет на соответствие.Для преодоления нет ограничения в 200 символов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...