Python 比较两个多行字符串,如 GitHub

Python Diff Two Multiline Strings Like 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

这样的输出。谢谢。

我不太清楚你说的gitlab是什么格式;我没有像你的例子那样在 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

如果您想做一些更花哨的事情,您可以将数据视为单个字符串(就像以前一样),然后尝试在换行符上拆分。 return 格式似乎是 "{operation}{char}"(包括新行字符),因此您可以对所有具有相同操作的行进行分组和检测,并应用正确的逻辑。

我无法根据您的示例完全弄清楚您尝试应用的规则(您是否将所有混合行分组,然后添加行然后删除行或其他内容?),所以我不能给出你就是一个确切的例子。