如果get_matching_blocks()首先与之后的块匹配,则忽略某些块

时间:2019-01-16 11:24:38

标签: python python-3.x difflib

这是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 个答案:

答案 0 :(得分:0)

看看get_matching_blocks()的{​​{3}}

  

返回三元组的列表,描述不重叠的匹配子序列。每个三元组的形式为(i,j,n),表示a [i:i + n] == b [j:j + n]。 i和j中的三元组单调增加。

因此,根据您的输入"abxcd""cdab",它将在位置2(从0开始)的“ cdab”中搜索“ a”,然后在位置“ 3”中搜索“ b”是第二个字符串的最后一个位置。到到达“ 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。最初,它在位置0的'abcd'中搜索'a',在位置1中搜索'b',类似地在string2的位置2和3中搜索'c'和'd'

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