get_matching_blocks() игнорирует некоторые блоки, если сначала совпадает с блоками, которые появятся позже

Вот код Python -

import difflib
x = "abxcd"
y= "cdab"
s = difflib.SequenceMatcher(None, x, y)
for block in s.get_matching_blocks():
    a=block[0:]
    if a[2]>0:
        m=a[0]
        n=a[0]+a[2]
        print (x[m:n])

Он печатает только "ab" и игнорирует "cd". Но я хочу, чтобы он распечатывал и "ab", и "cd". Есть какой-либо способ сделать это?

1 ответ

Решение

Взгляните на документацию get_matching_blocks()

Возвращает список троек, описывающих непересекающиеся совпадающие подпоследовательности. Каждая тройка имеет форму (i, j, n) и означает, что a[i:i+n] == b[j:j+n]. Тройки монотонно растут в i и j.

Так что согласно вашим входам "abxcd" а также "cdab" он ищет "a" в "cdab", который находится в позиции 2(начинается с 0), а затем "b" в позиции "3", которая является последней позицией второй строки. К тому времени, когда он достигает 'x', вторая итерация строки уже завершена.

>>> s=difflib.SequenceMatcher(None,  "abxcd","cdab")
>>> s.get_matching_blocks()
[Match(a=0, b=2, size=2), Match(a=5, b=4, size=0)]

Давайте возьмем другой пример, где x="abxcd" а также y="abcd" вы получите результат как ab, cd, Первоначально он ищет "a" в "abcd", который находится в позиции 0, и "b" в позиции 1, а также "c" и "d" в позиции 2 и 3 строки 2

>>> s=difflib.SequenceMatcher(None,  "abxcd","abcd")
>>> s.get_matching_blocks()
[Match(a=0, b=0, size=2), Match(a=3, b=2, size=2), Match(a=5, b=4, size=0)]
Другие вопросы по тегам