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”和“^”,但我不确定这是否正确。