Python Diff две многострочные строки, такие как GitHub
Я хочу получить разностный вывод, подобный коммит-представлению github. И я попробовал это:
import difflib
first = """
def
baz
"""
second = """
deff
ba
bar
foo
"""
diff = ''
for text in difflib.unified_diff(first, second):
for prefix in ('---', '+++', '@@'):
if text.startswith(prefix):
break
else:
diff += text
Выход:
d e f+f
b a-z
+b+a+r+
+f+o+o+
Как я могу достичь,
1 def+f
2 ba-z
+
3 bar
4 foo
# -
# 5 line
# 6 line
выход так же, как это. Благодарю.
1 ответ
Я не совсем уверен, какой формат вы имеете в виду с gitlab; Я не видел различий типа "char-by-char" в gitlab, как в вашем примере. Если вам нужен более стандартный построчный вывод, я думаю, вам просто нужно передать списки в функцию diff:
for text in difflib.unified_diff(first.split("\n"), second.split("\n")):
if text[:3] not in ('+++', '---', '@@ '):
print text
Так как каждая строка отличается в вашем примере, diff просто увидит, что каждая строка полностью изменена, и даст вам вывод, подобный следующему:
-def
-baz
+deff
+ba
+bar
+foo
Если вы хотите сделать что-то более причудливое, вы можете обработать данные как одну строку (как и прежде), а затем попытаться разделить их на новые строки. Формат возврата, кажется, "{operation}{char}"
(включая символы новой строки), так что вы можете группировать и обнаруживать строки с одинаковой операцией и применять правильную логику.
Я не могу точно разработать правила, которые вы пытаетесь применить, основываясь на вашем примере (вы группируете все смешанные строки, затем добавляете строки, затем удаляете строки или что-то еще?), Поэтому я не могу дать вам точный пример.