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}" (включая символы новой строки), так что вы можете группировать и обнаруживать строки с одинаковой операцией и применять правильную логику.

Я не могу точно разработать правила, которые вы пытаетесь применить, основываясь на вашем примере (вы группируете все смешанные строки, затем добавляете строки, затем удаляете строки или что-то еще?), Поэтому я не могу дать вам точный пример.

Другие вопросы по тегам