Python Diff两个多行字符串像GitHub

时间:2017-06-03 19:57:56

标签: python string algorithm string-comparison difflib

我想实现像 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 个答案:

答案 0 :(得分:1)

我不太清楚gitlab的格式是什么意思;我没有像你的例子那样在gitlab中看到char-by-char差异。如果你想要一个更标准的逐行输出,那么我认为你只需要将列表传递给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}"(包括新行字符),因此您可以对所有具有相同操作的行进行分组和检测,并应用正确的逻辑。

根据你的例子我不能完全解决你试图应用的规则(你是否将所有混合线分组,然后添加线然后删除线或其他东西?),所以我不能给你一个确切的例子。