Python 查找字符串之间的差异

Python 查找字符串之间的差异,python,string,Python,String,我有下面的函数,它获取一个源代码和一个修改的字符串,并将其中更改的单词加粗 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(

我有下面的函数,它获取一个源代码和一个修改的字符串,并将其中更改的单词加粗

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>
def附件更改(s1、s2):
“将标记添加到已更改的单词”
l1=s1。拆分(“”)
l2=s2。拆分(“”)
对于i,枚举中的val(l1):
如果l1[i]。下()!=l2[i]。下()
s2=s2。替换(l2[i],%s”%l2[i])
返回s2
打印更改(“布兰妮·斯皮尔斯”、“布兰妮·斯皮尔斯”)#返回布兰妮·斯皮尔斯
它可以在具有相同字数的字符串上正常工作,但在不同的字数下失败,如
sora-iro-days
sorairo-days

我怎样才能把间隔考虑进去呢?

看看这个模块,你可以使用a来查找文本中的更改区域。

你可以使用,并这样做:

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
来自difflib导入的
不同
def附件更改(s1、s2):
“将标记添加到已更改的单词”
l1=s1。拆分(“”)
l2=s2。拆分(“”)
dif=列表(不同().比较(l1,l2))
如果i[:1]=='+'则返回'.join(['+i[2:]+''),否则在dif中为i返回i[2:]
如果不是“-?”中的i[:1])
打印更改(“布兰妮spirs”、“布兰妮sprears”)
打印更改(“索拉伊罗日”、“索拉罗日”)
#输出:
布兰妮·斯普雷尔斯
索拉罗日

一个小的升级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)
def show_diff(文本,n_文本):
seqm=difflib.SequenceMatcher(无、文本、n_文本)
输出源=[]
输出_new=[]
对于seqm.get_操作码()中的操作码a0、a1、b0、b1:
原始顺序=顺序a[a0:a1]
新的顺序=顺序b[b0:b1]
如果操作码=='equal':
输出原始追加(原始顺序)
输出\新追加(原始顺序)
elif操作码==“插入”:
输出_new.append(“{}”.format(new_seq))
elif操作码==“删除”:
输出_orig.append(“{}”.format(orig_seq))
elif操作码==“替换”:
输出_new.append(“{}”.format(new_seq))
输出_orig.append(“{}”.format(orig_seq))
其他:
打印('错误')
返回“”。连接(输出源),“”。连接(输出新)

@mata你真的可以回答这个问题。:)+一个极好的单班轮。您可能需要清理返回的字符串。输入
appendBoldChanges(“sorairo天”、“sora-iro天”)
会导致
sora-iro天
,而OP可能需要
sora-iro天
。真正的蟒蛇式优雅。@gauden-干杯;)我想这可能没什么关系,因为它们显示的都一样。如果这是一个问题,那么是的,
.replace(“”,)
最终将是修复方法。
sorairo天
soraiao天
我得到以下结果:^\n soraiao^\n天。我试图替换“\n”和“^”,但我不确定这是否正确。