2013-06-10 3 views
4

Я использую функциональность «нечеткого соответствия» модуля Regex.Модуль «regex» Python: значение Fuzziness

Как я могу получить значение «нечеткости» «совпадения», которое указывает, насколько отличается шаблон от строки, как «расстояние редактирования» в Левенштейне?

Я думал, что могу получить значение в объекте Match, но его там нет. Официальные документы ничего не говорили об этом.

.: например

regex.match('(?:foo){e}','for') 

a.captures() говорит мне, что слово «для» подобран, но я хотел бы знать значение нечеткость, которая должна быть 1 в этом случае.

Есть ли способ достичь этого?

+0

Это, конечно, не идеальна, но если все остальное не вы могли бы попробуйте повторить попытки с помощью '(?: foo) {e <= i}', где вы зацикливаете какое-то целое число 'i'. В первый раз, когда вы получаете матч, ваш 'i' является расстоянием Левенштейна. –

+0

Или если вы работаете с ограниченным числом ошибок, вы можете использовать что-то вроде '(foo) | ((?: Foo) {e = 1}) | ((?: Foo) {e = 2})' и проверить какая группа соответствует, если сначала e = 0, второй e = 1 и т. д. – Qtax

ответ

1
>>> import difflib 
>>> matcher = difflib.SequenceMatcher(None, 'foo', 'for') 
>>> sum(size for start, end, size in matcher.get_matching_blocks()) 
2 
>>> max(map(len, ('foo', 'for'))) - _ 
1 
>>> 
>>> 
>>> matcher = difflib.SequenceMatcher(None, 'foo', 'food') 
>>> sum(size for start, end, size in matcher.get_matching_blocks()) 
3 
>>> max(map(len, ('foo', 'food'))) - _ 
1 

http://docs.python.org/2/library/difflib.html#difflib.SequenceMatcher.get_matching_blocks http://docs.python.org/2/library/difflib.html#difflib.SequenceMatcher.get_opcodes

+0

Errrr ... Это обходное решение отлично, и difflib тоже хороший материал. Но я должен использовать вещь «groupdict» в re/regex, поэтому я не думаю, что для этого подходит difflib. Спасибо всем тем же. – tslmy

+0

Я заменил модуль регулярных выражений на difflib, как вы сказали, и он работает как шарм! Итак, я думаю, что это «SequenceMatcher» вещь, сравнимая с algrithm Левенштейна? – tslmy

+0

В [исходный код] (http://hg.python.org/cpython/file/464e8fd7300d/Lib/difflib.py) нет упоминания о Левенштейне. (Я не читал.) – falsetru

0
a = regex.match('(?:foo){e}','for') 
a.fuzzy_counts 

это возвращает кортеж (х, у, г), где:

х = число замен

у = количество вставок и

z = количество удалений

Но это не всегда надежный счетчик, то есть: регулярное выражение матч нечеткость ночь не приравнивают к истинному Левинштейн расстояния в некоторых случаях

Python regex module fuzzy match: substitution count not as expected

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

  • Нет связанных вопросов^_^