首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Python difflib:内联突出显示差异?

Python difflib:内联突出显示差异?
EN

Stack Overflow用户
提问于 2009-04-21 19:57:32
回答 3查看 15.3K关注 0票数 33

在比较相似的行时,我想突出显示同一行上的差异:

a) lorem ipsum dolor sit amet
b) lorem foo ipsum dolor amet

lorem <ins>foo</ins> ipsum dolor <del>sit</del> amet

虽然difflib.HtmlDiff似乎做了这种内联突出显示,但它会生成非常冗长的标记。

不幸的是,我找不到另一个不是逐行操作的类/方法。

我错过了什么吗?如有任何建议,我们将不胜感激!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-04-25 12:05:13

对于您的简单示例:

import difflib
def show_diff(seqm):
    """Unify operations between two compared strings
seqm is a difflib.SequenceMatcher instance whose a & b are strings"""
    output= []
    for opcode, a0, a1, b0, b1 in seqm.get_opcodes():
        if opcode == 'equal':
            output.append(seqm.a[a0:a1])
        elif opcode == 'insert':
            output.append("<ins>" + seqm.b[b0:b1] + "</ins>")
        elif opcode == 'delete':
            output.append("<del>" + seqm.a[a0:a1] + "</del>")
        elif opcode == 'replace':
            raise NotImplementedError, "what to do with 'replace' opcode?"
        else:
            raise RuntimeError, "unexpected opcode"
    return ''.join(output)

>>> sm= difflib.SequenceMatcher(None, "lorem ipsum dolor sit amet", "lorem foo ipsum dolor amet")
>>> show_diff(sm)
'lorem<ins> foo</ins> ipsum dolor <del>sit </del>amet'

这适用于字符串。你应该决定如何使用“替换”操作码。

票数 51
EN

Stack Overflow用户

发布于 2017-12-03 18:50:50

这是一个受@tzot的answer above启发的内联差异(也兼容Python3):

def inline_diff(a, b):
    import difflib
    matcher = difflib.SequenceMatcher(None, a, b)
    def process_tag(tag, i1, i2, j1, j2):
        if tag == 'replace':
            return '{' + matcher.a[i1:i2] + ' -> ' + matcher.b[j1:j2] + '}'
        if tag == 'delete':
            return '{- ' + matcher.a[i1:i2] + '}'
        if tag == 'equal':
            return matcher.a[i1:i2]
        if tag == 'insert':
            return '{+ ' + matcher.b[j1:j2] + '}'
        assert False, "Unknown tag %r"%tag
    return ''.join(process_tag(*t) for t in matcher.get_opcodes())

它并不完美,例如,扩展“替换”操作码以识别被替换的整个单词,而不仅仅是几个不同的字母,这将是一个很好的起点。

示例输出:

>>> a='Lorem ipsum dolor sit amet consectetur adipiscing'
>>> b='Lorem bananas ipsum cabbage sit amet adipiscing'
>>> print(inline_diff(a, b))
Lorem{+  bananas} ipsum {dolor -> cabbage} sit amet{-  consectetur} adipiscing
票数 7
EN

Stack Overflow用户

发布于 2009-04-21 20:04:03

difflib.SequenceMatcher将在单条线路上运行。您可以使用“操作码”来确定如何将第一行更改为第二行。

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

https://stackoverflow.com/questions/774316

复制
相关文章

相似问题

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