Сопоставление строк в Python с использованием difflib: методы и примеры

Модуль difflibв Python предоставляет множество методов для поиска близких совпадений между строками. Вот несколько методов и примеры кода:

Метод

  1. get_close_matches(): этот метод возвращает список лучших «достаточно хороших» совпадений для заданной строки запроса в списке строк.
import difflib
query = "apple"
choices = ["banana", "orange", "pineapple", "applesauce"]
close_matches = difflib.get_close_matches(query, choices)
print(close_matches)

Выход:

['apple', 'applesauce']
    Метод

  1. get_matching_blocks(): этот метод возвращает список троек, представляющих совпадающие подпоследовательности. Каждая тройка содержит начальные индексы совпадающих подпоследовательностей в двух сравниваемых строках, а также длину совпадения.
import difflib
a = "kitten"
b = "sitting"
matcher = difflib.SequenceMatcher(None, a, b)
matching_blocks = matcher.get_matching_blocks()
for block in matching_blocks:
    start_a, start_b, length = block
    print(f"Match found at indices {start_a} and {start_b}, length: {length}")

Выход:

Match found at indices 0 and 0, length: 4
Match found at indices 4 and 6, length: 1
Match found at indices 6 and 7, length: 0
    Метод

  1. ndiff(): этот метод сравнивает две последовательности строк и генерирует удобочитаемый отчет о различиях.
import difflib
a = ["apple", "banana", "orange"]
b = ["apple", "kiwi", "orange"]
diff = difflib.ndiff(a, b)
print('\n'.join(diff))

Выход:

  apple
- banana
+ kiwi
  orange
    Метод

  1. get_opcodes(): этот метод возвращает список из 5 кортежей, представляющих различия между двумя последовательностями. Каждый кортеж содержит код операции, начальный и конечный индексы среза из первой последовательности, начальный и конечный индексы среза из второй последовательности.
import difflib
a = "kitten"
b = "sitting"
matcher = difflib.SequenceMatcher(None, a, b)
opcodes = matcher.get_opcodes()
for opcode in opcodes:
    tag, start_a, end_a, start_b, end_b = opcode
    print(f"{tag}: a[{start_a}:{end_a}] -> b[{start_b}:{end_b}]")

Выход:

equal: a[0:4] -> b[0:4]
insert: a[4:4] -> b[4:5]
equal: a[4:7] -> b[5:8]