Нечеткие Регулярные Выражения

в своей работе я с большими результатами использовал приближенные алгоритмы сопоставления строк, такие как расстояние Дамерау–Левенштейна, чтобы сделать мой код менее уязвимым для орфографических ошибок.

Теперь мне нужно сопоставлять строки с простыми регулярными выражениями, такими как TV Schedule for dd (Jan|Feb|Mar|...). Это означает, что строка TV Schedule for 10 Jan должен возвращать 0 в то время как T Schedule for 10. Jan должен вернуть 2.

Это можно сделать, создав все строки в регулярном выражении (в данном случае 100x12) и найдя лучшее совпадение, но это не шов практично.

У вас есть идеи, как это сделать эффективно?

6 ответов


нашел библиотека TRE, который, похоже, может точно выполнять нечеткое сопоставление регулярных выражений. Пример: http://hackerboss.com/approximate-regex-matching-in-python/ Однако он поддерживает только вставку, удаление и замену. Никакой транспозиции. Но я думаю, что это работает нормально.

я попробовал сопровождающий инструмент agrep с регулярным выражением в следующем файле:

TV Schedule for 10Jan
TVSchedule for Jan 10
T Schedule for 10 Jan 2010
TV Schedule for 10 March
Tv plan for March

и получил

$ agrep -s -E 100 '^TV Schedule for \d\d (Jan|Feb|Mar)$' filename
1:TV Schedule for 10Jan
8:TVSchedule for Jan 10
7:T Schedule for 10 Jan 2010
3:TV Schedule for 10 March
15:Tv plan for March

большое спасибо за все ваши предложения.


Также см.:Python regex (более новая версия, Oct '14) (поиск "нечеткого" внутри документа).

Если вы не парень Python (ни я), вы могла составить ваш код на C (exe / dll). Тогда вы сможете использовать свою dll даже из старого доброго vb6 (и тому подобное).

другие библиотеки на выбор:

  • TRE / agrep ('классический, хороший, старый и быстрый) (поиск' agrep performace"), но вам нужно написать POSIX-совместимое регулярное выражение (поиск "регулярные выражения info posix") Конечно, все библиотеки / примеры, использующие TRE, имеют это ограничение (поиск "приблизительного соответствия регулярных выражений hackerboss в python"). Для массивных данных: поиск "быстрой реализации CUDA алгоритма agrep".
  • ФРЕДЖЕ (Java) - некоторые (более) ограничения (например, не смотреть вперед/смотреть назад)
  • fuzzy-wuzzy (на основе Python) - стоит смотрю, не проверял...

поиск для:

  • 'Comparison_of_regular_expression_engines'
  • 'regular-expressions.info инструменты'

(извините, что не могу опубликовать реальные ссылки)


Я просто использовать regex модуль: 'альтернативный модуль регулярного выражения, чтобы заменить re.- Это обеспечивает фамильярность re но включает в себя опции для нечеткого соответствия, а также несколько других улучшений на re.

для двоичных файлов Windows см. на этом ресурсе.


здесь является ресурсом по вопросу, который вы задаете. Это немного тизер для компании. Более полезным может быть этой статье. Я видел реализацию, вдохновленную документом, которая могла бы выполнять нечеткий поиск, смещенный для специального языка (например, арабский против английского), на большом наборе данных.

В общем, вы не сможете сделать то, о чем вы просили. Можно сделать поиск по регулярному выражению нечетким, заменив символы классами эквивалентности, или можно выполнить поиск база данных для близких совпадений, определенных расстоянием Левенштейна. Попытка расширить (n)DFA за регулярным выражением, чтобы включить ближние матчи по расстоянию, быстро стала бы невозможно сложной.


вы рассматривали возможность использования лексер?

Я никогда не использовал его, поэтому я не могу помочь, но похоже, что он подходит!


Я начал реализовывать инструмент Java под названием prex для приблизительного сопоставления регулярных выражений. Инструмент определяет, как далеко строка s от соответствия регулярному выражению r, то есть сколько вставок, удалений и замен на s хотя бы обязательны (минимальная стоимость) такие, что результирующая строка s' приемлем r. Если вы заинтересованы, вы можете проверить код https://github.com/julianthome/prex. Я был бы очень рад получить некоторые отзывы. Обратите внимание, что подход все еще немного медленный, но в настоящее время я включаю некоторые эвристики для улучшения его производительности.