Вы можете увидеть, что он считает, чтобы соответствующие блоки:
>>> difflib.SequenceMatcher(isjunk=lambda x: x == " ", a="a b c", b="a bc").get_matching_blocks()
[Match(a=0, b=0, size=3), Match(a=4, b=3, size=1), Match(a=5, b=4, size=0)]
Первые два вам сказать, что это соответствует «б» на «б» и «в» к «с». (Последний тривиальный)
Вопрос в том, почему «a b» можно подобрать. Я нашел ответ на это в коде. Сначала алгоритм находит кучу соответствующих блоков, многократно называя find_longest_match. Что примечательно, о find_longest_match является то, что она позволяет барахло символ существовать на концах струны:
If isjunk is defined, first the longest matching block is
determined as above, but with the additional restriction that no
junk element appears in the block. Then that block is extended as
far as possible by matching (only) junk elements on both sides. So
the resulting block never matches on junk except as identical junk
happens to be adjacent to an "interesting" match.
Это означает, что первое он считает «а» и «б», чтобы быть матчей (с учетом пространства символа на конец «a» и в начале «b»).
Затем, интересная часть: код делает последний чек, чтобы увидеть, смещен ли какой-либо из блоков, и объединяет их, если они есть. Смотрите этот комментарий в коде:
# It's possible that we have adjacent equal blocks in the
# matching_blocks list now. Starting with 2.5, this code was added
# to collapse them.
Так в основном это соответствие «а» и «б», то объединение этих двух блоков в «б» и называя, что матч, несмотря на символ пробела является нежелательной.
Может быть неправильно, но будет 'a' и' b' как по существу, становится '«а»', если их пробела игнорируются 'difflib'? – mdscruggs
yes и он вернет '1.0' –
2.7 docstring для SequenceMatcher:« .ratio() возвращает float в [0, 1], измеряя «подобие» последовательностей . Как правило, a .ratio () значение выше 0,6 означает, что последовательности являются близкими совпадениями " – mdscruggs