Как одновременно искать в тексте несколько регулярных выражений?

Есть N текстов и есть M регексовых выражений

Для каждого выражения надо найти тексты, соответствующие этому выражению.


M и N — достаточно большие числа, чтобы последовательно выполнять РЕГЕКС_i в ТЕКСТ_j и смотреть результат


Хочется как-то одновременно просматривать все регексы


Ну и желательно какие-нибудь модули посоветуйте, если не сложно
  • Вопрос задан
  • 3290 просмотров
Пригласить эксперта
Ответы на вопрос 6
github.com/dprokoptsev/pire

This library is aimed at checking a huge amount of text against
relatively many regular expressions.
Ответ написан
@MikhailEdoshin
Я не исследовал специально, но впечатление такое, что готового инструмента нет. Хотя конструкция кажется очевидной — есть M конечных автоматов (регексов), мы объединяем их в один (методы известны), плюс в начальном и/или конечном состоянии каждого исходного автомата устанавливаем callback с идентификатором этого автомата и позицией в тексте.

Может быть, взять какую-нибудь библиотеку KA и из нее что-то попытаться смастерить? Для C есть libfa (порт явовской dk.brics.automaton), первую половину задачи она выполнит, а вот помеченные состояния и callback — не знаю.
Ответ написан
Комментировать
Вряд ли есть готовые решения, но ведь можно делать не последовательно, а параллельно, обрабатывая в нескольких процессах/потоках, тк эти операции независимы и хорошо распараллеливаются. Если Вы еще не рассматривали этот вариант, то модуль multiprocessing думаю Вам поможет.

Если и это будет медленно, можно попробовать переписать на C.
Ответ написан
smagen
@smagen
Руководитель разработки Postgres Professional
Я работаю над похожей задачей: индексный поиск по регулярным выражениям в БД. Можно вот тут почитать и презентацию посмотреть:
www.pgcon.org/2012/schedule/events/383.en.html
В применении к вашему случаю алгоритм будет такой:
1. Залить N текстов в БД.
2. Построить индекс.
3. Искать по индексу M раз.
Было интересно посмотреть, какие у вас тексты и выражения, насколько применим к этой задаче мой подход.
Ответ написан
Alukardd
@Alukardd
Хочется как-то одновременно просматривать все регексы
Ну так состряпайте сложный regexp с множественным ИЛИ.
Ответ написан
Mithgol
@Mithgol
Составное регулярное выражение?

Пайтона не знаю, но в джаваскрипте выглядело бы эвона как:

/(regex1|regex2|regex3|regex4|regex5|regex6|regex7|regex8|…|regexM)/
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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