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.