在Python中,生成突出显示两个简单字符串差异的HTML

问题描述 投票:0回答:2

我需要用 python 突出显示两个简单字符串之间的差异,将不同的子字符串包含在 HTML span 属性中。所以我正在寻找一种简单的方法来实现以下示例所示的功能:

hightlight_diff('Hello world','HeXXo world','red')

...它应该返回字符串:

'He<span style="color:red">XX</span>o world'

我用谷歌搜索并看到提到了 difflib,但它应该已经过时了,而且我还没有找到任何好的简单演示。

python html diff difflib
2个回答
9
投票

您需要的一切都来自 difflib ——例如:

>>> import difflib
>>> d = difflib.Differ()
>>> l = list(d.compare("hello", "heXXo"))
>>> l
['  h', '  e', '- l', '- l', '+ X', '+ X', '  o']

该列表中的每个元素都是两个输入字符串中的一个字符,前缀为其中之一

  • "  "
    (2 个空格),两个字符串中该位置都存在的字符
  • "- "
    (破折号空格),第一个字符串中该位置出现的字符
  • "+ "
    (加空格),第二个字符串中该位置出现的字符。

迭代该列表,您可以准确构建您想要创建的输出。

docs 中没有提到 difflib 以任何方式过时或弃用。


0
投票

您可以使用此代码进行一些小的更改: (此代码格式化每个相同和不同的字符串)

    import Levenshtein
    style_same = "style=\"background: green;\"" 
    style_unsame = "style=\"background: red;\""
    f_str = '<span {style}>{text}</span>'
    def getFormattedDiff(astring, bstring):
        formatted_a = []
        formatted_b = []
        begina, beginb = 0, 0
        for matching_block in Levenshtein.matching_blocks(Levenshtein.opcodes(astring, bstring), astring, bstring):
            a, b, size = matching_block.a, matching_block.b, matching_block.size
            formatted_a.append(f_str.format(style=style_unsame, text = astring[begina:a]) + f_str.format(style=style_same, text = astring[a:a+size]))
            formatted_b.append(f_str.format(style=style_unsame, text = bstring[beginb:b]) + f_str.format(style=style_same, text = bstring[b:b+size]))
            begina, beginb = a+size, b+size
        formatted_a.append(f_str.format(style=style_unsame, text = astring[begina:]))
        formatted_b.append(f_str.format(style=style_unsame, text = bstring[beginb:]))
        return ''.join(formatted_a), ''.join(formatted_b)
© www.soinside.com 2019 - 2024. All rights reserved.