匹配长字符串时,SequenceMatcher的get_matching_blocks

时间:2018-08-21 03:50:42

标签: python string sequencematcher

在:

from difflib import SequenceMatcher

print('---------------------ksv in long string')
temp='gksvlkdfvjmflkvmoiflksjvmoiflkvmoilfjvmoierlkvjfdsljfiefjvo\
isfvoiafvjfojwfdkvasldkcosxzfjirkjmcoipfvjopsnosjvjrgegrjsdijfowijfoiwjfoiwjfoiwjfoijlksvlkdfvjmfl\
kvmoiflksjvmoiflkvmoilfjvmoierlkvjfdsljfiefjvofegegewtfvasvervvwfjoiw'

print(SequenceMatcher(None, 'ksv',temp).get_matching_blocks())

print('-----------------------long string start with ksv')
temp='ksvlkdfvjmflkvmoiflksjvmoiflkvmoilfjvmoierlkvjfdsljfiefjvo\
isfvoiafvjfojwfdkvasldkcosxzfjirkjmcoipfvjopsnosjvjrgegrjsdijfowijfoiwjfoiwjfoiwjfoijlksvlkdfvjmfl\
kvmoiflksjvmoiflkvmoilfjvmoierlkvjfdsljfiefjvofegegewtfvasvervvwfjoiw'

print(SequenceMatcher(None, 'ksv',temp).get_matching_blocks())

print('-----------------------ksv in short string')
temp='gksvlkdfvjmflkvmoiflksjvmoiflkvmoilfjvmoierlkvjfdsljfiefjvo'

print(SequenceMatcher(None, 'ksv',temp).get_matching_blocks())

退出:

---------------------ksv in long string
[Match(a=3, b=226, size=0)]
-----------------------start with ksv
[Match(a=0, b=0, size=3), Match(a=3, b=225, size=0)]
-----------------------ksv in short string
[Match(a=0, b=1, size=3), Match(a=3, b=59, size=0)]

显然,对于第一个match_result,'gks'处于临时状态,但是get_matching_blocks没有返回该块。

然后我删除温度的第一个'g',它返回了正确的块。

我尝试使温度变短,但仍然不能以“ gks”开头, 返回右图块。

所以我很困惑。 为什么第一次尝试没有成功?

1 个答案:

答案 0 :(得分:1)

Tim Peters所说,

将autojunk = False传递给SequenceMatcher(),它将返回正确的块。

以下是有关自动垃圾的一些解释:

1,某项重复项占序列的1%以上。 2,顺序超过200条。

自动垃圾将不会匹配以进行序列匹配。

来自Python document

自动垃圾启发式:SequenceMatcher支持一种启发式,可将某些序列项自动视为垃圾。试探法计算每个单个项目出现在序列中的次数。如果某项重复项(在第一个项之后)占序列的1%以上,并且该序列的长度至少为200,则该项目被标记为“受欢迎”,并且出于序列匹配的目的被视为垃圾。在创建SequenceMatcher时,可以通过将autojunk参数设置为False来关闭此启发式。