Я пишу регулярное выражение для предупреждения, которое я получаю на CPE Huawei. Текст, который я должен соответствовать:
Warning: There are security risks in the configuration file. You are advised to save the configuration immediately. If you choose to save, the current configuration file will be unavailable after version downgrade.Are you sure to save now? [Y/N]:
И регулярное выражение, которое я использую для сопоставления, следующее:
Warning:(.|\n)*Are you sure to continue\?\s*\[Y/N\]:\s*$
Работает нормально:
$ python3 -m timeit -s "import re;T=$text" "re.search(r'Warning:(.|\n)*Are you sure to continue\?\s*\[Y/N\]:\s*$', T)"
100000 loops, best of 3: 9.8 usec per loop
Если я заменю \n
на что-либо, содержащее пробел
, тогда регулярное выражение неожиданно станет невероятно медленным:
Warning:(.| )*Are you sure to continue\?\s*\[Y/N\]:\s*$
попробуйте с \n|
или \s
, и он сделает то же самое
Я не беспокоюсь о timeit просто потому, что он работал в течение нескольких минут в моем ответе.
Это, вероятно, проблема с катастрофическим возвратом, однако я хотел бы понять, почему это происходит. В частности: почему пробелы имеют значение?
Каждый пробел
уже соответствует .
, поэтому он никогда не должен использоваться вообще, и если .
не совпадает, то
тоже не совпадает, поэтому я не понимаю, почему это будет увеличить количество шагов возврата.