Избегайте катастрофического возврата для моего текущего требования - PullRequest
2 голосов
/ 06 апреля 2019

Я должен соответствовать определенным определенным критериям в фразе (группа слов) (все, что между ними) (группа слов), например:

(mirror|reflect|serve|adapt)(\s*\w+\s*\W*\s*)*?(population|client|customer|stakeholder|market|society|culture|consumer|end-user)

Так что в любое время во фразе "зеркало"бананы бананы населения "Я хочу, чтобы соответствовать.Это лучшее решение?Является ли это склонным к катастрофическому возвращению назад?

1 Ответ

1 голос
/ 06 апреля 2019

Часть (\s*\w+\s*\W*\s*)*? может привести к катастрофическому откату назад, поскольку единственным обязательным шаблоном внутри *? -квантованной группы является \w+, и он заключен в другие необязательные шаблоны (\s* и \W* могут соответствовать пустым строкам и обратите внимание, что смежные * -квантованные шаблоны, такие как \s*\W*\s* match, совпадают с теми же символами, что является плохой практикой, приводящей к катастрофическому откату назад.

Если вы протестируете свое регулярное выражение с mirror banana banannas populatio, вы получите катастрофическую ошибку возврата.

Лучший способ регулярных выражений в вашем случае, то есть когда вы читаете списки начальных / конечных слов из файла JSON, это регулярное выражение, подобное

(?:leading_word1|leading_word2|...|leading_wordN)(.*?)(?:trailing_word1|trailing_word2|...|trailing_wordN)

Значение, которое вам нужно, будет в группе 1 или во всех значениях в списке, если вы используете re.findall (вы говорите, что используете Python).

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