首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用SequenceMatcher生成内容差异(Python)

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

Stack Overflow用户
提问于 2010-05-05 02:09:18
回答 1查看 1.6K关注 0票数 2

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

我想用一种类似于Github的方式来格式化这个差异。

我看过difflib,发现它能做我想要的事情。但是,Differ类的级别太高;我必须解析diff行才能生成具有内联diffs的HTML。Differ类使用SequenceMatcher类来生成其diffs。但从SequenceMatcher来看,它的级别非常低。我甚至还没有想出如何进行逐行比较(我承认我没有花太多时间进行实验)。

有没有人知道(除了the difflib documentation之外)使用SequenceMatcher类的任何资源?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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中的行。它基本上是一组变化。在每个组中,您都有一个以元组形式存储的详细更改列表。对于第一组,它返回两个更改,如下所示(第一项是更改类型,接下来的两个数字表示要删除的行范围,后面是要添加的行范围):

代码语言:javascript
复制
('replace', 24, 29, 24, 29)
('insert', 33, 33, 33, 35)

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

如果您不介意阅读源代码,请看一下difflib.unified_diff()的实现。它非常简单,它生成一个与您想要的内容等效的纯文本。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2767822

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档