Как заменить строку, если она частично (до 90%) соответствует искомой строке в Python при работе с Python-docx? - PullRequest
0 голосов
/ 25 сентября 2018

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

Я использую python-docx для работы с документами Word.
Приведенный ниже код заменяет текст в моем текстовом документе, если он полностью совпадает.
Код ссылка

def docx_replace_regex(doc_obj, regex , replace):

for p in doc_obj.paragraphs:
    if regex.search(p.text):
        inline = p.runs
        # Loop added to work with runs (strings with same style)
        for i in range(len(inline)):
            if regex.search(inline[i].text):
                text = regex.sub(replace, inline[i].text)
                #inline[i].text = text.decode('UTF-8')
                inline[i].text = text

for table in doc_obj.tables:
    for row in table.rows:
        for cell in row.cells:
            docx_replace_regex(cell, regex , replace)

У меня нет правильного способа заменить / заменить частично совпадающую строку.
Любая помощь очень ценится.
Заранее спасибо.

1 Ответ

0 голосов
/ 26 сентября 2018

Я не думаю, что фильтрация регулярных выражений дает правильные результаты, потому что модуль re дает только непересекающиеся совпадения;если вы отфильтровываете некоторые совпадения, то совпадение менее 90%, которое совпадает с совпадением 90% +, не позволит распознать совпадение 90% +.

Я также рассматривал difflib, но этодаст вам первый матч, а не лучший матч.

Я думаю, вам придется написать его с нуля.

Что-то вроде:

def find_fuzzy_match(match_string, text):
    # use an iterator so that we can skip to the end of a match.
    text_iter = enumerate(text)
    for index, char in text_iter:
        try:
            match_start = match_string.index(char)
        except ValueError:
            continue
        match_count = 0
        zip_char = zip(match[match_start:], text[index:])
        for match_index, (match_char, text_char) in enumerate(zip_char):
            if match_char == text_char:
                match_count += 1
                last_match = match_index
        if match_count >= len(match_string) * 0.9:
            yield index, index + last_match
            # Advance the iterator past the match
            for x in range(last_match):
                next(text_iter)
...