Непрерывающие регулярные выражения (модуль Python Re) - PullRequest
0 голосов
/ 16 ноября 2018

Что может вызывать постоянное поведение в операции match () регулярного выражения (с модулем re Python)?

Я сейчас ломаю себе голову, пытаясь решить проблему, которая ставила меня в тупик часами. Почему висит строка ниже?

re.compile(r'.*?(now|with that|at this time|ready|stop|wrap( it|) up|at this point|happy|pleased|concludes|concluded|we will|like to)(,)*(( |\n)[a-z]+(\'[a-z]+)*,*){0,20}( |\n)(take|for|to|open|entertain|answer|address)(( |\n|)[a-z]+(\'[a-z]+)*,*){0,20}( |\n|)(questions|Q *& *A).*?', re.DOTALL| re.IGNORECASE).match("I would now like to turn the presentation over to your host for today's call, Mr. Mitch Feiger, please proceed.")

Короче говоря, я использую match (), регулярное выражение r'.*?(now|with that|at this time|ready|stop|wrap( it|) up|at this point|happy|pleased|concludes|concluded|we will|like to)(,)*(( |\n)[a-z]+(\'[a-z]+)*,*){0,20}( |\n)(take|for|to|open|entertain|answer|address)(( |\n|)[a-z]+(\'[a-z]+)*,*){0,20}( |\n|)(questions|Q *& *A).*?'

А текст такой: "I would now like to turn the presentation over to your host for today's call, Mr. Mitch Feiger, please proceed."

Я понимаю, что моё регулярное выражение - это что-то вроде беспорядка, оно было построено с течением времени, чтобы несколько неуклюже соответствовать параграфам, в которых ораторы объявляют о начале сеанса вопросов. Мое основное замешательство сейчас заключается в попытке найти то, что может быть причиной того, что, как я полагаю, является непрерывным поиском.

Он застревает на многих других фрагментах текста, используемых моей программой, но далеко не на всех (программа обрабатывает тысячи текстовых файлов, каждый из которых содержит ~ 100 таких фрагментов текста, с которыми необходимо выполнить сопоставление), и Я не вижу никаких общих факторов. Чтобы было ясно, это не должен возвращать совпадение, но эта проверка действительно должна быть сделана, и я не могу понять, почему она зависает, как это происходит.

В более общем смысле, что может привести к бесконечному зависанию соответствия регулярного выражения Python? Я бы хотел получить информацию, чтобы я мог решить проблему сам, но на этом этапе я бы взял дешевый ответ ...

1 Ответ

0 голосов
/ 16 ноября 2018

Perl-совместимые регулярные выражения (PCRE), которыми пользуется модуль Python, больше не являются «регулярными» в смысле компьютерных наук.Из-за этого они могут пострадать от катастрофического возврата: https://swtch.com/~rsc/regexp/regexp1.html

Это мало поможет вам с вашей проблемой.Что вам поможет:

  1. разбейте ваше регулярное выражение на несколько небольших блоков
  2. посмотрите, сколько времени занимает выполнение каждого блока
  3. начните собирать блоки, чтобы получитьближе к вашему первоначальному огромному регулярному выражению

Возможно, вам придется прекратить попытки делать все с помощью одного отдельного регулярного выражения, и вы можете использовать 1 или 2 и немного кода для более эффективного объединения двух частей.

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