2016-12-03 10 views
0

나는 python difflib 문서를 읽고 있습니다. difflib.differ 출력 따르면이다Python Difflib - PHP Diff 클래스 형식과 같은 diff sequneces를 얻는 방법

의미 코드 '-' '서열 모두에 공통 라인을'2 시퀀스 독특한 1 '+'행 시퀀스에 고유 라인? '입력 시퀀스에 존재하지 않는 라인

나는 또한이 질문을 읽고있다. Python Difflib - How to Get SDiff Sequences with "Change" Op이 질문에 대한 답변을 Sнаđошƒаӽ 님이 보낼 수 없습니까?

나는 거의 펄 아니면 sdiff 무엇인지 '해달라고하지만이 기능을 조정해야합니다 : 기능 이상 PHP Diff Class

내가하려고했는데 그 값을 반환처럼

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 

이되고 UNCHANGE, ADDED 및 DELETED 중 하나입니다.

사례 1 : 삭제 된 4 차의 경우 더 복잡하다 일부 문자

- The good bad 
+ The good the bad 
?   ++++ 

을 경우 2을 삽입하여 변형 라인 : 라인이 일부 문자를 삭제하여 수정

- The good the bad 
?   ---- 
+ The good bad 

사례 3 : 일부 문자를 삭제 및 삽입 및/또는 바꾸어 줄이 수정되었습니다.

- The good the bad and ugly 
?  ^^ ---- 
+ The g00d bad and the ugly 
?  ^^   ++++ 

케이스 4 : '?'라인이 삭제 나는이 코드 건너 뛸

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)) 

내에서 조정할 방법을 모르는

- The good the bad and the ugly 
+ Our ratio is less than 0.75! 

선. 나는 새로운 라인이 삽입되지 않았을 때만 (-)을 추가하고 새로운 라인을 삽입하면 (+)를 추가하려고한다.

+0

인용문으로 인용 된 섹션을 인용 부호로 표시하십시오. – simbabque

답변

0

필자는 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 3 
        sequence +=1 
        sdiffs.append((sequence,'+',diffs[i+2][2:])) 
        i+=3 
       elif diffs[i+2].startswith('?') and i+2 < length: # case 2 
        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