1
import difflib

test1 = ")\n )"
test2 = "#)\n #)"

d = difflib.Differ()
diff = d.compare(test1.splitlines(), test2.splitlines())
print "\n".join(diff)

输出:

- )
+ #)
-  )
+  #)
?  +

如您所见,它没有检测到第一行(无?行)的更改,但在第二行中检测到了更改

任何人都知道为什么 difflib 认为它是删除/添加,而不是更改?

4

1 回答 1

2

一个字符串是一种极端情况。对于两个或多个字符,始终正确检测到一个字符的插入。这是一个简单的算法来证明:

import difflib

def show_diffs(limit):
    characters = 'abcdefghijklmnopqrstuvwxyz'
    differ = difflib.Differ()
    for length in range(1, limit + 1):
        for pos in range(0, length + 1):
            line_a = characters[:length]
            line_b = line_a[:pos] + 'A' + line_a[pos:]
            diff = list(differ.compare([line_a], [line_b]))
            if len(diff) == 2 and diff[0][0] == '-' and diff[1][0] == '+':
                marker = 'N'  # Insertion not detected
            elif len(diff) == 3 and diff[0][0] == '-' and diff[1][0] == '+' and diff[2][0] == '?':
                marker = 'Y'  # Insertion detected
            else:
                print('ERROR: unexpected diff for %r -> %r:\n%r' % (line_a, line_b, diff))
                return
            print('%s %r -> %r' % (marker, line_a, line_b))

show_diffs(limit=3)

它仅对 1 个字符的字符串“失败”:

N 'a' -> 'Aa'
N 'a' -> 'aA'
Y 'ab' -> 'Aab'
Y 'ab' -> 'aAb'
Y 'ab' -> 'abA'
Y 'abc' -> 'Aabc'
Y 'abc' -> 'aAbc'
Y 'abc' -> 'abAc'
Y 'abc' -> 'abcA'
于 2015-12-21T10:02:07.017 回答