2014-01-21 3 views
0

У меня есть список регулярных выражений и строка. Я хочу знать, какое из регулярных выражений (возможно, более одного) соответствует строке, если она есть. Тривиальным решением было бы попробовать регулярные выражения один за другим, но эта часть критически важна ... Есть ли более быстрое решение? Может быть, путем объединения регулярных выражений в одном государственном компьютере?Поиск подходящих регулярных выражений из списка альтернатив

Причина: регулярные выражения представляют собой пользовательские фильтры, соответствующие входящим строкам. Когда приходит сообщение с строкой, системе необходимо выполнить дополнительные пользовательские действия.

Доступно до 10000 регулярных выражений. Регулярные выражения предоставляются пользователем и могут быть несколько упрощены, если необходимо (.* должно быть разрешено хотя :)). Список регулярных выражений сохраняется в MongoDB, но я также могу их предварительно отбирать и выполнять поиск внутри Python, если это необходимо.

Похожие вопросы:

  • похож на this question, но ограничения различны: нечеткое соответствие не хватает, количество регулярных выражений значительно ниже (до 10k)
  • похожи на this question, но я могу предварительно обработать регулярные выражения, если необходимо
  • похоже на this question, но мне нужно найти все соответствующие регулярные выражения

Я был бы признателен за помощь.

+0

Использование '({}). Format (') | ('. Join (the_regexes))' неприемлемо? Это был бы простой способ присоединиться к возможным регулярным выражениям. Вероятно, встроенный движок сможет оптимизировать поиск, однако, если вам нужно присоединиться к 10000 регулярным выражениям, я уверен, что для его компиляции потребуется * большое количество времени. Если регулярные выражения не изменяются часто, вы можете сохранить скомпилированное регулярное выражение в базу данных. Другой подход заключается в объединении групп регулярных выражений фиксированного размера и затем применении «наивного» алгоритма с производными регулярными выражениями. – Bakuriu

+0

@ Бакуриу, исправьте меня, если я ошибаюсь, но не использовал бы это, только скажу вам, что строка ввода соответствовала одному из регулярных выражений, но не соответствовали каким конкретным регулярным выражениям? – gms7777

+1

@ gms7777 Да, вы правы. Но проблема заключается не в понимании того, какое регулярное выражение соответствует (это можно сделать с использованием групп, в конечном итоге с использованием именованных групп), но такое регулярное выражение не может помочь вам, если вы хотите найти * все * регулярные выражения, которые будут соответствовать данному тексту. AFAIK с помощью встроенных регулярных выражений просто не может сделать лучше, чем наивный алгоритм.Вам придется реализовать свой собственный механизм регулярных выражений, который создает один минимальный DFA и отслеживает имена регулярных выражений, связанных с согласованным состоянием. – Bakuriu

ответ

0

Прежде всего, если у вас есть> 10K регулярных выражений, вы определенно должны предварительно отбирать и скомпилировать их (используя re.compile) в памяти. В качестве второго шага я рекомендую подумать о параллелизме. Нити в Python не сильны, из-за GIL. Поэтому вместо этого используйте несколько процессов. И в-третьих, я бы подумал о масштабируемости на количестве серверов, используя ZeroMQ (или другой MQ) для связи.

В качестве интересной научной задачи вы можете попытаться построить регулярное выражение парсер, который строит деревья подобных регулярных выражений:

A 
|-B 
|-c 
    |-D 
    |-E 

Так что, если регулярное выражение А соответствует строка, то B, C, D, E матча тоже , Таким образом, вы сможете сократить количество проверок. ИМХО, эта задача займет так много времени. Использование кучи серверов будет дешевле и быстрее.

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