get_matching_blocks 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' находится в temp, но get_matching_blocks не возвращает блок.

затем я удаляю первый 'g' из временного интервала, он возвращает правильный блок.

и я пытаюсь сделать темп короче и все еще не начинать с "gks", он также вернул правильный блок.

так что я в замешательстве. почему первая попытка не удалась?

1 ответ

Как сказал Tim Peters,

Передавая autojunk=False в SequenceMatcher(), он возвращает правильные блоки.

Вот краткое объяснение об автоответчике:

1 dup дубликаты элемента составляют более 1% последовательности. 2、 последовательность составляет более 200 пунктов.

Autojunk не будет соответствовать для сопоставления последовательности.

из документа Python:

Автоматическая эвристика мусора: SequenceMatcher поддерживает эвристику, которая автоматически обрабатывает определенные элементы последовательности как нежелательные. Эвристика подсчитывает, сколько раз каждый отдельный элемент появляется в последовательности. Если дубликаты элемента (после первого) составляют более 1% последовательности, а длина последовательности составляет не менее 200 элементов, этот элемент помечается как "популярный" и рассматривается как нежелательный для соответствия последовательности. Эту эвристику можно отключить, установив аргумент autojunk в False при создании SequenceMatcher.

Другие вопросы по тегам