Получить регулярное выражение с нечеткостью - PullRequest
0 голосов
/ 24 апреля 2018

У меня очень большой список слов (около 200 КБ):

["cat", "the dog", "elephant", "the angry tiger"]

Я создал это регулярное выражение с нечеткостью:

regex = "(cat){e<3}|(the dog){e<3}|(elephant){e<3}|(the angry tiger){e<3}"

У меня есть входные предложения:

sentence1 = "The doog is running in the field"
sentence2 = "The elephent and the kat"
...

То, что я хочу получить, это:

res1 = ["the dog"]
res2 = ["elephant", "cat"]

Я пробовал это например:

re.findall(regex, sentence2, flags=re.IGNORECASE|re.UNICODE) 

Но это выводит меня:

["elephent", "kat"]

Есть идеи, как получить правильный ответ с исправленными словами? Я хочу получить группу захвата регулярных выражений для каждого матча, но я стараюсь это сделать.

Возможно, я делаю это неправильно, и, возможно, метод регулярных выражений не очень удачный, но if item in list с циклом for слишком длинный для выполнения.

1 Ответ

0 голосов
/ 24 апреля 2018

Это можно сделать, вручную составив регулярное выражение и назвав группы:

import regex as re

a = ["cat", "the dog", "elephant", "the angry tiger"]
a_dict = { 'g%d' % (i):item for i,item in enumerate(a) } 

regex = "|".join([ r"\b(?<g%d>(%s){e<3})\b" % (i,item) for i,item in enumerate(a) ])

sentence1 = "The doog is running in the field"
sentence2 = "The elephent and the kat"

for match in re.finditer(regex, sentence2, flags=re.IGNORECASE|re.UNICODE):
    for key,value in match.groupdict().items():
        if value is not None:
            print ("%s: %s" % (a_dict.get(key), value))

elephant:  elephent
cat:  kat
...