我想在Python中生成文本(更具体地说,Markdown格式的文章)的修订版之间的差异。
我想用一种类似于Github的方式来格式化这个差异。
我看过difflib,发现它能做我想要的事情。但是,Differ类的级别太高;我必须解析diff行才能生成具有内联diffs的HTML。Differ类使用SequenceMatcher类来生成其diffs。但从SequenceMatcher来看,它的级别非常低。我甚至还没有想出如何进行逐行比较(我承认我没有花太多时间进行实验)。
有没有人知道(除了the difflib documentation之外)使用SequenceMatcher类的任何资源?
发布于 2010-05-05 06:50:14
SequenceMatcher实际上并没有那么低级。对您来说,最有趣的方法是get_grouped_opcodes。它将返回一个生成器,该生成器生成带有变更描述的列表。
我将通过一个来自random commit on GitHub的示例来解释它。假设您对新旧文件"tabs_events.js“运行SequenceMatcher(None, a, b).get_grouped_opcodes()。生成器将生成两个组,它们由那些"...“表示GitHub中的行。它基本上是一组变化。在每个组中,您都有一个以元组形式存储的详细更改列表。对于第一组,它返回两个更改,如下所示(第一项是更改类型,接下来的两个数字表示要删除的行范围,后面是要添加的行范围):
('replace', 24, 29, 24, 29)
('insert', 33, 33, 33, 35)第一个命令告诉您将旧文件中的24-28行(从0开始)替换为新文件中的24-28行。第二个命令告诉您在旧文件的第33行插入新文件中的第33-34行。我认为很明显,'delete'会做什么,而'equal'是那些在GitHub中没有突出显示的行。
如果您不介意阅读源代码,请看一下difflib.unified_diff()的实现。它非常简单,它生成一个与您想要的内容等效的纯文本。
https://stackoverflow.com/questions/2767822
复制相似问题