Поиск различий между строками
у меня есть следующая функция, которая получает источник и измененные строки и выделяет полужирным шрифтом измененные слова в нем.
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 days
и sorairo days
.
как я могу принять во внимание spaced?
3 ответов
можно использовать 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
посмотреть difflib
модуль, вы можете использовать SequenceMatcher
чтобы найти измененные области в тексте.
небольшое обновление 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)