Как заменить строку, если она частично (до 90%) совпадает с искомой строкой в ​​Python при работе с Python-docx?

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

Я использую python-docx для работы с документами Word.
Нижеприведенный код заменяет текст в моем документе 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)

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


person Purva    schedule 25.09.2018    source источник
comment
Я не думаю, что это связано с python-docx как таковым, или, по крайней мере, не должно. python-docx может предоставить вам объект str, который вы затем можете модифицировать по своему усмотрению и отправить обратно python-docx. Ваша проблема сводится к тому, как выполнить нечеткий поиск/замену для объекта str, о котором вы сможете найти больше в поиске, например, в этом топе Google: github.com/seatgeek/fuzzywuzzy   -  person scanny    schedule 25.09.2018
comment
@scanny На самом деле я работаю над машинным переводом, я хочу заменить английский текст переведенным текстом в моем документе Word построчно, выполнив поиск и замену текстовых строк, для которых я использую Python-docx. и используя run для сохранения форматирования текста. Я могу заменить текст, когда получаю точное совпадение строки с использованием указанного кода, но я хочу заменить текстовую строку, когда она соответствует примерно 90%.   -  person Purva    schedule 26.09.2018


Ответы (1)


Я не думаю, что фильтрация регулярных выражений дает правильные результаты, потому что модуль 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)
person Aaron Bentley    schedule 26.09.2018
comment
На самом деле я работаю над машинным переводом, я хочу заменить английский текст переведенным текстом в моем текстовом документе построчно, выполнив поиск и замену текстовых строк, для которых я использую Python-docx и используя run, чтобы сохранить форматирование текста . Я могу заменить текст, когда получаю точное совпадение строки с использованием указанного кода, но я хочу заменить текстовую строку, когда она соответствует примерно 90%. - person Purva; 26.09.2018
comment
мой find_fuzzy_match найдет совпадения. Их должно быть легко заменить, как только вы их найдете. - person Aaron Bentley; 26.09.2018