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)]