Этот модуль стандартной библиотеки 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 для этого модуля.