在:
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‘在temp中,但get_matching_blocks没有返回该块。
然后我删除了temp的第一个'g‘,它返回了右边的块。
我试着让temp变得更短,但仍然没有以'gks‘开头,它也返回了右边的块。
所以我很困惑。为什么第一次尝试没有成功?
发布于 2018-08-21 12:55:56
就像Tim Peters说的,
将autojunk=False传递给SequenceMatcher(),它将返回正确的块。
以下是关于autojunk的一些解释,简单地说:
1、项的重复项占序列的1%以上。2、序列超过200个项目。
对于序列匹配,将不匹配自动垃圾邮件。
自动垃圾启发式: SequenceMatcher支持自动将某些序列项视为垃圾的启发式。启发式计算每个单独的项目在序列中出现的次数。如果一个项目的重复项(在第一个项目之后)占序列的1%以上,并且该序列至少有200个项目长,则该项目被标记为“流行”,并且出于序列匹配的目的被视为垃圾。通过在创建SequenceMatcher时将autojunk参数设置为False,可以关闭此启发式方法。
https://stackoverflow.com/questions/51941303
复制相似问题