2016-12-03 5 views
0

Я читаю документацию python difflib. В соответствии с выходом difflib.differ является:Python Difflib - Как получить diff sequneces, например, в формате PHP Diff Class

Код Значения «-» линии уникален для последовательности 1 линию «+», уникальных для последовательности 2 «» линии, общей для обоего последовательностей «? «Линия не присутствует в любой входной последовательности

Я также читал этот вопрос на StackOverflow Python Difflib - How to Get SDiff Sequences with "Change" Op, но не быть в состоянии добавить комментарий на Sнаđошƒаӽ» s ответ.

Я не»знаю, что SDiff на языке Perl довольно много, но мне нужно, чтобы настроить эту функцию:

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 

быть как PHP Diff Class

выше функции я стараюсь, и возвращает значение UNCHANGE, ADDED и DELETED. DELETED является более сложным с 4-разностными случаев, является:

Случай 1: линия модифицируется вставки некоторые символы

- 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: '?' Строка удалена

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

Я не знаю, как настроить в пределах этого кода

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

, чтобы пропустить линия. Я просто хочу добавить (-) только в том случае, если новая строка не вставлена ​​и не добавляется с (+) при вызове новой строки.

+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