我正在阅读Python的difllib文档。根据每个文档,不同的增量给出了一个序列
Code Meaning
'- ' line unique to sequence 1
'+ ' line unique to sequence 2
' ' line common to both sequences
'? ' line not present in either input sequence
但是"Change“操作又如何呢?如何获得与Perl的sdiff中的结果类似的"c“指令?
发布于 2013-12-15 12:18:20
看看这个脚本。
邮箱: sdiff.py @ hungrysnake.net
http://hungrysnake.net/doc/software__sdiff_py.html
Perl的sdiff(Algorithm::Diff)不考虑“匹配率”,但是python的sdiff.py考虑了一下。=)
我有两个文本文件。
$ cat text1.txt
aaaaaa
bbbbbb
cccccc
dddddd
eeeeee
ffffff
$ cat text2.txt
aaaaaa
bbbbbb
xxxxxxx
ccccccy
zzzzzzz
eeeeee
ffffff
我通过sdiff命令或Perl的sdiff(Algorithm:: diff )获得了并排的Diff。
$ sdiff text1.txt text2.txt
aaaaaa aaaaaa
bbbbbb bbbbbb
cccccc | xxxxxxx
dddddd | ccccccy
> zzzzzzz
eeeeee eeeeee
ffffff ffffff
Sdiff不考虑“匹配率”=(
我是通过sdiff.py得到的
$ sdiff.py text1.txt text2.txt
--- text1.txt (utf-8)
+++ text2.txt (utf-8)
1|aaaaaa 1|aaaaaa
2|bbbbbb 2|bbbbbb
| > 3|xxxxxxx
3|cccccc | 4|ccccccy
4|dddddd < |
| > 5|zzzzzzz
5|eeeeee 6|eeeeee
6|ffffff 7|ffffff
[ ] | +
[ <- ] 3|cccccc
[ -> ] 4|ccccccy
Sdiff.py考虑“匹配率”=)
我想要sdiff.py的结果。你不觉得吗?
发布于 2016-12-04 07:52:51
我不太清楚Perl的"Change“操作是什么。如果它类似于PHP DIFF输出,我用下面的代码解决我的问题:
def sdiffer(s1, s2):
differ = difflib.Differ()
diffs = list(differ.compare(s1, s2))
i = 0
sdiffs = []
length = len(diffs)
sequence = 0
while i < length:
line = diffs[i][2:]
if diffs[i].startswith(' '):
sequence +=1
sdiffs.append((sequence,'u', line))
elif diffs[i].startswith('+ '):
sequence +=1
sdiffs.append((sequence,'+', line))
elif diffs[i].startswith('- '):
sequence +=1
sdiffs.append((sequence,'-',diffs[i][2:]))
if i+1 < length and diffs[i+1].startswith('? '):
if diffs[i+3].startswith('?') and i+3 < length : # case 2
sequence +=1
sdiffs.append((sequence,'+',diffs[i+2][2:]))
i+=3
elif diffs[i+2].startswith('?') and i+2 < length: # case 3
sequence +=1
sdiffs.append((sequence,'+',diffs[i+2][2:]))
i+=2
elif diffs[i+1].startswith('+ ') and i+2<length and diffs[i+2].startswith('? '): # case 1
sequence +=1
sdiffs.append((sequence,'+', diffs[i+1][2:]))
i += 2
else: # the line is deleted and inserted new line # case 4
sequence +=1
sdiffs.append((sequence,'+', diffs[i+1][2:]))
i+=1
i += 1
return sdiffs
感谢@Sнаđошƒаӽ的代码。
https://stackoverflow.com/questions/15938605
复制相似问题