2024-10-02 00:26:07 发布
网友
我正在阅读Python的difllib文档。根据每个文档,不同的delta给出一个序列
Code Meaning '- ' line unique to sequence 1 '+ ' line unique to sequence 2 ' ' line common to both sequences '? ' line not present in either input sequence
但是“改变”行动呢?如何获得一个类似于Perl的sdiff结果的“c”指令?在
difflib中没有直接的c代码来显示如您所说的Perl的sdiff中更改的行。但你可以很容易地做一个。在difflib的delta中,“changed lines”也有'- ',但与实际删除的行不同,delta中的下一行被标记为'? ',表示delta的前一个索引中的行是“changed”,而不是删除。delta中这条线的另一个目的是作为“指南”来确定变更在哪条线上。在
c
'- '
'? '
因此,如果delta中的一条线被标记为'- ',那么根据delta的接下来几行,有四种不同的情况:
案例1:通过插入一些字符修改的行
- The good bad + The good the bad ? ++++
案例2:通过删除部分字符来修改行
案例3:通过删除并插入和/或替换一些字符来修改行:
- The good the bad and ugly ? ^^ + The g00d bad and the ugly ? ^^ ++++
案例4:行被删除
- The good the bad and the ugly + Our ratio is less than 0.75!
如您所见,用'? '标记的行显示了在哪里进行了哪种类型的修改。在
请注意,如果被比较的两行之间的^{}值小于0.75,difflib会认为删除一行。这是我通过测试发现的一个值。在
所以要推断一条线是改变了的,你可以这样做。这将返回带有代码“c”标记的已更改行和标记为“u”的未更改行的差异,就像在Perl的sdiff中:
def sdiffer(s1, s2): differ = difflib.Differ() diffs = list(differ.compare(s1, s2)) i = 0 sdiffs = [] length = len(diffs) while i < length: line = diffs[i][2:] if diffs[i].startswith(' '): sdiffs.append(('u', line)) elif diffs[i].startswith('+ '): sdiffs.append(('+', line)) elif diffs[i].startswith('- '): if i+1 < length and diffs[i+1].startswith('? '): # then diffs[i+2] starts with ('+ '), obviously sdiffs.append(('c', line)) i += 3 if i + 3 < length and diffs[i + 3].startswith('? ') else 2 elif diffs[i+1].startswith('+ ') and i+2<length and diffs[i+2].startswith('? '): sdiffs.append(('c', line)) i += 2 else: sdiffs.append(('-', line)) i += 1 return sdiffs
希望有帮助。在
这是一个老问题,所以我不确定我的努力会得到多好的回报。:-(我就是忍不住回答这个问题,因为我最近一直在使用difflib。
:-(
看这个剧本。在
在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不要考虑“匹配率”=(
我挺过来的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. 你不是吗?在
我不太清楚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
感谢您的代码。在
difflib中没有直接的
c
代码来显示如您所说的Perl的sdiff中更改的行。但你可以很容易地做一个。在difflib的delta中,“changed lines”也有'- '
,但与实际删除的行不同,delta中的下一行被标记为'? '
,表示delta的前一个索引中的行是“changed”,而不是删除。delta中这条线的另一个目的是作为“指南”来确定变更在哪条线上。在因此,如果delta中的一条线被标记为
'- '
,那么根据delta的接下来几行,有四种不同的情况:案例1:通过插入一些字符修改的行
案例2:通过删除部分字符来修改行
^{pr2}$案例3:通过删除并插入和/或替换一些字符来修改行:
案例4:行被删除
如您所见,用
'? '
标记的行显示了在哪里进行了哪种类型的修改。在请注意,如果被比较的两行之间的^{} 值小于0.75,difflib会认为删除一行。这是我通过测试发现的一个值。在
所以要推断一条线是改变了的,你可以这样做。这将返回带有代码“c”标记的已更改行和标记为“u”的未更改行的差异,就像在Perl的sdiff中:
希望有帮助。在
这是一个老问题,所以我不确定我的努力会得到多好的回报。
:-(
我就是忍不住回答这个问题,因为我最近一直在使用difflib。看这个剧本。在
在sdiff.py@ hungrysnake.net网站在
http://hungrysnake.net/doc/software__sdiff_py.html
Perl的sdiff(Algorithm::Diff)不考虑“匹配率”, 但Python的sdiff.py想想看。=)
我有两个文本文件。在
我通过sdiff命令或Perl的sdiff(Algorithm::diff)获得并排的diff。在
^{pr2}$Sdiff不要考虑“匹配率”=(
我挺过来的sdiff.py在
在 Sdiff.py考虑“匹配率”=)
我想要结果sdiff.py. 你不是吗?在
我不太清楚Perl的“Change”操作是什么。如果它类似于PHP DIFF输出,我用以下代码解决我的问题:
感谢您的代码。在
相关问题 更多 >
编程相关推荐