Этот модуль стандартной библиотеки Python предоставляет классы и функции для сравнения последовательностей, таких как строки, списки и т. Д. В этой статье мы рассмотрим основы SequenceMatcher, get_close_matches и Differ.

SequenceMatcher гибкий класс для сравнения пар последовательностей любого типа при условии, что элементы последовательности являются хешируемыми. Базовый алгоритм предшествует алгоритму, опубликованному в конце 1980-х годов Рэтклиффом и Обершелпом под гиперболическим названием «сопоставление гештальт-паттернов», и он немного лучше него. Идея состоит в том, чтобы найти самую длинную непрерывную совпадающую подпоследовательность, которая не содержит «мусорных» элементов; эти «ненужные» элементы в некотором смысле неинтересны, например, пустые строки или пробелы. (Обработка мусора является расширением алгоритма Рэтклиффа и Обершелпа.) Та же идея затем рекурсивно применяется к частям последовательностей слева и справа от соответствующей подпоследовательности. Это не дает минимальных последовательностей редактирования, но дает совпадения, которые нравятся людям.

Итак, давайте посмотрим, как его использовать.

from difflib import SequenceMatcher
str1 = 'abcd'
str2 = 'abcde'
seq = SequenceMatcher(a=str1, b=str2)
print(seq.ratio())

Класс SequenceMatcher принимает два параметра a и b и сравнивает сходство b с a и дает нам оценку или соотношение сходства. Таким образом, приведенный выше код выводит соотношение 0.88888, что означает, что str2 на 80% похоже на str1.

Функция get_close_matches дает нам первые похожие слова из списка, который похож на заданную строку.

from difflib import get_close_matches
word_list = ['acdefgh', 'abcd','adef','cdea']
str1 = 'abcd'
matches = get_close_matches(str1, word_list, n=2, cutoff=0.3)
print(matches)

Здесь n - это количество наиболее похожих слов, которые мы хотим получить в выводе, а cutoff - это минимальное ratio значение, необходимое для этого слова, чтобы классифицировать его как похожее. Таким образом, эта часть выводит ['abcd', 'abcdefgh'], если мы увеличим отсечку до 0.7, будет выведено только ['abcd'], поскольку это единственное слово в списке, которое даст коэффициент подобия ›0,7. Эта функция очень удобна при создании быстрого «кода обнаружения опечатки», например, если мы напишем «приложение», она может подсказать, имели ли вы в виду «яблоко».

Класс Differ обеспечивает удобочитаемость дельт в двух последовательностях.

from diffib import Differ
from pprint import pprint
 
txt1 = '''
hello world.
we like python.'''.splitlines()
txt2 = '''
hello world.
we like python coding'''.splitlines()
dif = Differ()
df = list(dif.compare(txt1, txt2))
pprint(df)

Это дает нам такой результат.

Здесь мы видим, что он сравнивает txt2 с txt1 и дает нам удобочитаемую структуру, показывающую, что изменилось в txt2 по сравнению с txt1..

Как мы видим, здесь «привет, мир» одинаково в обеих последовательностях, но второе предложение изменилось, и это показывает, что «кодирование» - это изменение во втором предложении обеих строк. Вот видеоурок для этого

В модуле difflib гораздо больше интересных и сложных функций, обязательно ознакомьтесь с официальной документацией python для этого модуля.