Нечеткое сопоставление строк, которое можно пропустить? например я (.*). имеет 0 расстояние до Я здесь.

Я пишу чат-бот Python. Независимо от того, что это за метод (Левенштейн, LCS, регулярное выражение и т. д.), я хочу, чтобы шаблон, подобный My name is [ A ]., был достаточно умным, чтобы соответствовать таким строкам, как:

My name is Tslmy.              #Distance should = 0, and groupdict()['a'] outputs "Tslmy"
My name is Tesla Tahomana.     #Distance should = 0(!), and groupdict()['a'] outputs "Tesla Tahomana"
my  naem ist tslmy .           #With a little typo, the distance = 5, and groupdict()['a'] outputs "tslmy "

Позвольте мне использовать groupdict()['a'] для обозначения того, что захватил объект [ A ] (на самом деле (?P<identifier>match)).

  • Другими словами, я ищу «Левенштейн» с пропусками/пропусками/пробелами/пренебрежением, а также выбираю то, что было пропущено.
  • По-другому, я ищу нечеткое (также известное как приблизительное) регулярное выражение, которое может быть менее строгим с шаблоном, по-прежнему предоставляет старый добрый groupdict(), а также значение "нечеткости" (или "расстояние редактирования", необходимое для определения "наиболее подходящего шаблона для строки" позже).
    Это предпочтительное решение, поскольку оно обеспечивает "достаточное" groupdict() при правильном управлении.
    Однако , Библиотека TRE и библиотека REGEX, которая оказалась наиболее близким решением, похоже, не обеспечивают значение «нечеткости». Если это можно решить, то тем лучше!

Это возможно? Спасибо за внимание.

Обновление:

В конце концов я решил использовать мощный модуль regex, но так и не смог получить " значение размытости».

Поскольку вопрос на этой странице теоретически решен, добавление слишком большого количества слов будет нечестным. Поэтому я предложил еще один вопрос об этой новой проблеме и надеюсь, что вы сможете ее решить!


person tslmy    schedule 10.06.2013    source источник
comment
Вы можете рассмотреть возможность использования Damerau-Levenshtein, а не простого Levenshtein, поскольку он будет считать, что «naem» имеет расстояние 1 от «name», а не 2, а не то, что это поможет вам в вашей проблеме.   -  person icktoofay    schedule 10.06.2013
comment
Да, я использую DL в производстве. Для упрощения вопроса я назвал его просто нормальным Левенштейном. Более того, на самом деле мне все равно, что такое нечеткий алгоритм. Спасибо за ваши напоминания, они порадуют тех, кто не наслаждался DL~! @icktoofay   -  person tslmy    schedule 10.06.2013
comment
Кстати, вы, вероятно, хотите, чтобы ваш последний . был экранирован; [.] или \. -- в противном случае он соответствует любому символу, а не только самому себе.   -  person Charles Duffy    schedule 17.11.2015


Ответы (2)


Вы можете использовать RegEx для основного соответствия:

r"My name is (\w+){1,2}."

А затем используйте библиотеку TRE, чтобы учесть варианты.

person joel.d    schedule 10.06.2013
comment
Э-э-э... Позвольте мне спросить, как я могу использовать эту библиотеку в своем коде Python? Кажется, что python\setup.py.in нужен win32\Release\tre.dll, которого не существует. - person tslmy; 10.06.2013
comment
Обновление: после некоторого поиска в Google я обнаружил, что это является более простой альтернативой... может быть? - person tslmy; 10.06.2013
comment
Ну, я выбираю этот ответ на данный момент. Я решил использовать мощный модуль regex в конце концов, но все еще не смог получить нечеткость стоимость. Поскольку вопрос на этой странице теоретически решен, добавление слишком большого количества слов будет нечестным. Поэтому я задал еще один вопрос об этой новой проблеме и надеюсь, что вы сможете ее решить! - person tslmy; 10.06.2013

DAT REGEX O_O

(?i)(?:(?:my|ym).?|.?(?:my|ym))\s+(?:.?(?:..me|n..e|na..)|(?:..me|n..e|na..).?)\s+(?:(?:is|si).?|.?(?:is|si))\s+(\w[\w\s])\s

Давайте разделим:

  • (?i) : установите модификатор i для соответствия регистру без учета регистра.
  • (?:(?:my|ym).?|.?(?:my|ym)) : это будет соответствовать my, ym, My, Ym, may, amy etc...
  • \s+ : соответствует пробелу один или несколько раз
  • (?:.?(?:..am|n..e|na..)|(?:..am|n..e|na..).?) : соответствует name, naao, tame, lame, n99e, names, Naats etc...
  • \s+ : соответствует пробелу один или несколько раз
  • (?:(?:is|si).?|.?(?:is|si)) : соответствует is, si, ist, sit, siR etc...
  • \s+ : соответствует пробелу один или несколько раз
  • (\w[\w\s]*) : сопоставьте слова и пробелы один или несколько раз и сгруппируйте их (должно начинаться со слова \w)
  • \s* : совпадение пробелов ноль или более раз

Онлайн-демонстрация

person HamZa    schedule 10.06.2013
comment
Чувак, ты меня убиваешь!~ :) - person tslmy; 10.06.2013
comment
Хе-хе~ Вы можете улучшить его, используя [a-z] вместо \w в зависимости от ваших потребностей, так как \w также будет соответствовать _ и цифрам. - person HamZa; 10.06.2013
comment
Извините, таких паттернов куча, так что, будучи очень ленивым, я не могу себе это позволить. Кстати, вам потребовалось какое-то время, чтобы составить этот паттерн, верно? - person tslmy; 10.06.2013
comment
@tslmy Хммм действительно не упомянул время, но я бы подумал о 10 мин. Я думаю, это будет зависеть от того, насколько свободно вы владеете регулярными выражениями, я пишу регулярные выражения здесь, на SO, почти каждый день xD. Кстати, вы подали мне хорошую идею написать что-то, что автоматизирует процесс написания этого регулярного выражения. Что-то в PHP для создания регулярного выражения, как я сделал здесь в разделе «Нарушение законов регулярного выражения». - person HamZa; 10.06.2013
comment
Спасибо за ваши усилия! Я только что закончил среднюю школу за 3 дня до этого и во всех смыслах я первокурсник. Регулярное выражение, по правде говоря, занимает у меня несколько дней, чтобы изучить - сложнее, чем химия~! Кажется, вы отлично справляетесь с автоматизацией генерации регулярных выражений. Еще раз спасибо! - person tslmy; 10.06.2013
comment
@tslmy Это проще, чем вы думаете, я узнал об этом здесь, кстати. Читаю несколько руководств в Интернете и оттачиваю свои навыки, отвечая на вопросы, и, конечно же, учусь на других ответах. - person HamZa; 10.06.2013
comment
Вы также можете использовать такие инструменты, как этого парня, которые значительно упрощают написание надежных регулярных выражений. - person joel.d; 11.06.2013