使用SequenceMatcher(Python)生成内容差异

Bli*_*ixt 2 python diff

我想在Python中生成文本修订版(更具体地说,Markdown格式的文章)之间的差异.

我想以类似于Github的方式格式化这个差异.

我看了看,difflib发现它做了我想要的.但是,Differ班级太高级了; 我将不得不解析diff行来生成带内联差异的HTML.本Differ类使用SequenceMatcher类生成的diff文件.但SequenceMatcher相比之下,它看起来非常低.我甚至没有弄清楚如何做一个逐行的差异(我承认我没有花很多时间进行实验).

有谁知道任何资源的使用SequenceMatcher类(除了difflib文件)?

Luk*_*ský 8

SequenceMatcher实际上不是那么低级.对你来说最有趣的方法是get_grouped_opcodes.它将返回一个生成器,生成包含更改描述的列表.

我将在GitHub上随机提交的一个例子中解释它.假设您运行SequenceMatcher(None, a, b).get_grouped_opcodes()旧文件和新文件"tabs_events.js".生成器将生成两个组,这些组由GitHub中的那些"......"行表示.这基本上是一组变化.在每个组中,您都有一个存储为元组的详细更改列表.对于第一个组,它返回两个看起来像这样的更改(第一个项是更改类型,接下来的两个数字表示要删除的行范围,后面是要添加的行范围):

('replace', 24, 29, 24, 29)
('insert', 33, 33, 33, 35)
Run Code Online (Sandbox Code Playgroud)

第一个告诉您从旧文件中用新文件中的第24-28行替换第24-28行(从0开始).第二个告诉您在旧文件的第33行插入新文件中的第33-34行.我认为很明显会'delete'做什么,并且'equal'GitHub中没有突出显示那些行.

如果您不介意阅读源代码,请查看实现difflib.unified_diff().它非常简单,它可以生成与您想要的相同的纯文本.