0

在:

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 没有返回该块。

然后我删除了 temp 的第一个“g”,它返回了正确的块。

我尝试缩短温度,但仍然不以“gks”开头,它也返回了正确的块。

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

4

1 回答 1

1

正如蒂姆·彼得斯所说,

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

这里是关于autojunk的一些解释,简单来说:

1、一个item的重复占序列的1%以上。2、序列超过200项。

序列匹配不会匹配 autojunk。

来自Python 文档

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

于 2018-08-21T04:55:56.020 回答