2014-09-06 2 views
0

Я работал над выделением определенного фрагмента информации из файла длиной в несколько тысяч строк кода. Мой оригинальный регулярное выражение было это:Почему существует огромное различие в скорости между этими регулярными выражениями?

re.findall('#+\s+Athstats\s+Radio\s+(\d+).+?(\d+)\s+nodes\s+allocated\(nodealloc\)\s+ (\d+)\s+nodes\s+deleted\(nodefree\)', source_string, re.DOTALL) 

После того как я изменил его на них:

re.findall('#+\s*Athstats\s*Radio\s*(\d).*?#+.*?(\d+)\s*nodes\s*allocated\(nodealloc\)', source_string, re.DOTALL) 
re.findall('#+\s*Athstats\s*Radio\s*(\d).*?#+.*?(\d+)\s*nodes\s*deleted\(nodefree\)', source_string, re.DOTALL) 

вещи замедлились к ползанию ... она принимает вопросы секунд вместо микро/нано секунд! Почему это? Я использую Python 2.7, просматривая текстовый файл длиной в несколько тысяч строк.

+0

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

+0

Информация, которую он просматривает, может быть любым персонажем, поэтому неограниченный характер имеет смысл. Отдельные фрагменты информации расположены примерно на расстоянии 10-50 строк. – Nqobile

+0

Пожалуйста, не могли бы вы представить репрезентативную выборку ваших входных данных? (точнее, с началом и концом строк в частности). –

ответ

0

Даже это конфиденциальная информация, это не проблема, легко отправить образец, вы можете изменить данные и сохранить ту же структуру. Не видя никаких данных, все, что я могу заметить, это: .*?#+.*?, что приводит к катастрофическому обратному отскоку. Но без образца данных я не могу найти эффективную альтернативу. - Casimir et Hippolyte

... для полной дискуссии, содержащей достаточную информацию, чтобы понять, какие регулярные выражения будут работать и не будут работать хорошо, используя реализацию Python, см. «Освоение регулярных выражений» Джеффри Фридла. В первом выпуске обсуждалась реализация Python; второй - нет; Я не уверен в третьем. - Charles Duffy

Смежные вопросы