Python RegEx находка не отвечает - PullRequest
1 голос
/ 09 января 2020

У меня просто странная вещь. Я создаю прототип для сканирования текста, используя Open AN C в качестве корпуса.

В некоторых текстах модуль re просто не отвечает. Если кто-то может подтвердить, что это из-за сложности RegEx, то модуль re может справиться, я в порядке.

RegEx: preceding(?:[^A-Za-z0-9\n\r]*\w+[^A-Za-z0-9\n\r]*)+acquired

Текст, из-за которого возникает проблема:

Я утверждаю, что адрес Линкольна выражает ту же идею, которая была тогда в Европе , Каждый народ с общей историей и языком составляет нацию, и естественной формой выживания нации была государственная структура. Мысль о том, что американцы представляют собой органическое национальное подразделение, неявно объясняет, почему одиннадцать южных штатов не могли по-своему. Поскольку он принял президентство, Линкольн все еще говорил о Союзе, а не нации; но в ходе дебатов, предшествовавших десятилетиям, понятие союза приобрело метафизические качества государственности. В своем первом инаугурационном обращении Линкольн использовал «узы любви», и еще до того, как в Форт-Самтер в Чарлстон-Харбор выстрелили выстрелы, он подчеркнул неразрывные связи исторической борьбы:

python код произвести задачу:

import re

txt = "post text here"
regex = r"preceding(?:[^A-Za-z0-9\n\r]*\w+[^A-Za-z0-9\n\r]*)+acquired"
re.findall(regex, txt)

1 Ответ

3 голосов
/ 09 января 2020

Ваш шаблон подвержен влиянию catastrophi c backtracking .

Вот альтернативный шаблон, который должен работать с вашим вводом:

regex = r"preceding[^A-Za-z0-9\n\r]+(?:\w+[^A-Za-z0-9\n\r]+)+?acquired"

Это предполагает, что всегда должно быть как минимум один несловарный символ, разделяющий слова (в противном случае это будет просто совпадение с одним длинным непрерывным словом).

(см. также: Как узнать злое регулярное выражение? )

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