6

我有以下函数,它获取源和修改后的字符串,并将其中的更改后的单词加粗。

def appendBoldChanges(s1, s2):
    "Adds <b></b> tags to words that are changed"
    l1 = s1.split(' ')
    l2 = s2.split(' ')
    for i, val in enumerate(l1):
        if l1[i].lower() != l2[i].lower():
            s2 = s2.replace(l2[i], "<b>%s</b>" % l2[i])

    return s2
print appendBoldChanges("britney spirs", "britney spears") # returns britney <b>spears</b>

它适用于具有相同字数的字符串,但对于不同的字数(如sora iro dayssorairo days.

如何考虑间距?

4

3 回答 3

21

您可以使用difflib,并这样做:

from difflib import Differ

def appendBoldChanges(s1, s2):
    "Adds <b></b> tags to words that are changed"
    l1 = s1.split(' ')
    l2 = s2.split(' ')
    dif = list(Differ().compare(l1, l2))
    return " ".join(['<b>'+i[2:]+'</b>' if i[:1] == '+' else i[2:] for i in dif 
                                                           if not i[:1] in '-?'])

print appendBoldChanges("britney spirs", "britney sprears")
print appendBoldChanges("sora iro days", "sorairo days")
#Output:
britney <b>sprears</b>
<b>sorairo</b> days
于 2012-05-27T15:58:18.540 回答
2

查看difflib模块,您可以使用 aSequenceMatcher来查找文本中更改的区域。

于 2012-05-27T15:49:15.597 回答
1

一个小的升级 tp @fraxel 答案,它返回 2 个输出 - 原始版本和带有标记更改的新版本。在我看来,我还将单行代码更改为更具可读性的版本

def show_diff(text, n_text):
    seqm = difflib.SequenceMatcher(None, text, n_text)
    output_orig = []
    output_new = []
    for opcode, a0, a1, b0, b1 in seqm.get_opcodes():
        orig_seq = seqm.a[a0:a1]
        new_seq = seqm.b[b0:b1]
        if opcode == 'equal':
            output_orig.append(orig_seq)
            output_new.append(orig_seq)
        elif opcode == 'insert':
            output_new.append("<font color=green>{}</font>".format(new_seq))
        elif opcode == 'delete':
            output_orig.append("<font color=red>{}</font>".format(orig_seq))
        elif opcode == 'replace':
            output_new.append("<font color=blue>{}</font>".format(new_seq))
            output_orig.append("<font color=blue>{}</font>".format(orig_seq))
        else:
            print('Error')
    return ''.join(output_orig), ''.join(output_new)
于 2017-11-21T20:54:14.817 回答