Рассмотрим регулярное выражениеКак улучшить производительность этого регулярного выражения?
^(?:\s*(?:[\%\#].*)?\n)*\s*function\s
Он предназначен, чтобы соответствовать октава/MATLAB файлы сценариев, которые начинаются с определения функции.
Однако выполнение этого регулярного выражения невероятно медленно, и я не совсем уверен, почему. Например, если я пытаюсь оценить его в Python,
>>> import re, time
>>> r = re.compile(r"^(?:\s*(?:[\%\#].*)?\n)*\s*function\s")
>>> t0=time.time(); r.match("\n"*15); print(time.time()-t0)
0.0178489685059
>>> t0=time.time(); r.match("\n"*20); print(time.time()-t0)
0.532235860825
>>> t0=time.time(); r.match("\n"*25); print(time.time()-t0)
17.1298530102
В английском языке, что последняя строка говорит, что мое регулярное выражение занимает 17 секунд, чтобы оценить по простой строки, содержащей 25 символов новой строки!
Что это за мое регулярное выражение, которое делает его настолько медленным, и что я могу сделать, чтобы исправить его?
EDIT: Для уточнения, я хотел бы мое регулярное выражение, чтобы соответствовать следующей строке, содержащим комментарии:
# Hello world
function abc
включая любое количество пробелов, но не
x = 10
function abc
потому что то строка не начинается с «функции». Обратите внимание, что комментарии могут начинаться с «%» или «#».
Пожалуйста, укажите строку с образцом –
Просто используя 're.match (r" \ s * function \ s ", s)' достаточно, чтобы решить проблему, если вы планируете сопоставить [такой текст] (https: // regex101 .com/г/pC1uJ1/3).У вас есть случай классического катастрофического возврата с вашим регулярным выражением, в которое вложен кванторы с подшаблонами, которые могут соответствовать друг другу. –
Я добавил более подробно к вопросу о типах строк, которые регулярное выражение должно и не должно совпадать. – sffc