difflib - 防止替换整行

difflib - prevent replacement of whole line

比较下面的例子使用difflib.ndiff()

from difflib import unified_diff, ndiff

print("".join(ndiff(
    ["aba\n"],
    ["abbba\n"]
)))

print("".join(ndiff(
    ["aba\n"],
    ["abbbba\n"]
)))

输出:

- aba
+ abbba
?  ++

- aba
+ abbbba

第一个指出了必须添加字符的地方,而第二个基本上放弃并替换了整行。

如何打印第二张 相当于
"You need to insert 3 'b's [here]."?

第二次打印的预期输出

- aba
+ abbbba
?  +++

是否显示差异视觉高亮的判断依据是两个字符串的匹配度为0.75或更高。你的第一个例子是 0.80,你的第二个例子没有被高亮显示大约是 0.72。

没有提供调整此阈值的方法 - 但 difflib 是在纯 Python 中实现的;您可以从 Python 库中复制 difflib.py 并修改它以按照您想要的方式运行。 (至少在 Python 2.7 中,阈值接近名为 _fancy_replace 的方法的顶部。)

你也可以通过用空格填充所有字符串来伪造现有的difflib,这样它们的匹配率就会更高。例如,将 10 个空格添加到两个字符串,您可以将 abaabbbbbbbbbba 进行比较,但仍然会突出显示差异。