在:
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”开头, 返回右图块。
所以我很困惑。 为什么第一次尝试没有成功?
答案 0 :(得分:1)
如Tim Peters所说,
将autojunk = False传递给SequenceMatcher(),它将返回正确的块。
以下是有关自动垃圾的一些解释:
1,某项重复项占序列的1%以上。 2,顺序超过200条。
自动垃圾将不会匹配以进行序列匹配。
自动垃圾启发式:SequenceMatcher支持一种启发式,可将某些序列项自动视为垃圾。试探法计算每个单个项目出现在序列中的次数。如果某项重复项(在第一个项之后)占序列的1%以上,并且该序列的长度至少为200,则该项目被标记为“受欢迎”,并且出于序列匹配的目的被视为垃圾。在创建SequenceMatcher时,可以通过将autojunk参数设置为False来关闭此启发式。