Модуль регулярных выражений Python: значение нечеткости

Я использую функцию "нечеткого соответствия" модуля Regex.

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

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

e.g.:

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

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

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


person tslmy    schedule 10.06.2013    source источник
comment
Это, конечно, не идеально, но если ничего не помогает, вы можете попробовать повторить попытку с (?:foo){e<=i}, где вы перебираете некоторое целое число i. В первый раз, когда вы получите совпадение, ваше i будет расстоянием Левенштейна.   -  person Martin Ender    schedule 10.06.2013
comment
Или, если вы работаете с ограниченным количеством ошибок, вы можете использовать что-то вроде (foo)|((?:foo){e=1})|((?:foo){e=2}) и проверить, какая группа соответствует, если первое e = 0, второе e = 1 и т. д.   -  person Qtax    schedule 10.06.2013


Ответы (2)


>>> 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

person falsetru    schedule 10.06.2013
comment
Ээээ... Этот обходной путь отличный, и difflib тоже хорош. Но я должен использовать groupdict в re/regex, поэтому я не думаю, что difflib подходит для этого. Все равно спасибо. - person tslmy; 10.06.2013
comment
Я заменил модуль regex на difflib, как вы сказали, и он работает как шарм! Итак, интересно, сравнима ли эта штука SequenceMatcher с алгоритмом Левенштейна? - person tslmy; 13.06.2013
comment
В исходном коде Левенштейн не упоминается. (не дочитал до конца). - person falsetru; 13.06.2013

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

это возвращает кортеж (x, y, z), где:

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

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

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

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

Нечеткое совпадение модуля регулярных выражений Python: количество подстановок не соответствует ожиданиям< /а>

person Colin Anthony    schedule 08.07.2016