3

Python のdifllibのドキュメントを読んでいます。それぞれのドキュメントによると、 Differ 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" 命令を取得するにはどうすればよい ですか?

4

3 に答える 3

2

このスクリプトを見てください。

sdiff.py@hungrysnake.net

http://hungrysnake.net/doc/software__sdiff_py.html

Perl の sdiff(Algorithm::Diff) は「一致率」を考えていませんが、python の sdiff.py は考えています。=)

私は2つのテキストファイルを持っています。

$ 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 で結果が欲しいです。そうでしょう ?

于 2013-12-15T04:18:20.000 に答える
0

Perl の「変更」操作が何なのか、よくわかりません。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наđошƒаӽ。

于 2016-12-03T23:52:51.223 に答える