2015-12-21 1 views
1
import difflib 

test1 = ")\n)" 
test2 = "#)\n #)" 

d = difflib.Differ() 
diff = d.compare(test1.splitlines(), test2.splitlines()) 
print "\n".join(diff) 

ВЫВОД:Python difflib: не обнаруживает изменения

-) 
+ #) 
- ) 
+ #) 
? + 

, как вы можете видеть, оно не обнаруживает изменения для первой линии (не ? линии), но это было во второй строке

Кто-нибудь знает, почему difflib считает его удалением/добавлением, а не изменением?

ответ

2

Односимвольная строка - это кромка кромки. Для двух или более символов ввод одного символа всегда определяется правильно. Вот простой алгоритм, чтобы продемонстрировать, что:

import difflib 

def show_diffs(limit): 
    characters = 'abcdefghijklmnopqrstuvwxyz' 
    differ = difflib.Differ() 
    for length in range(1, limit + 1): 
     for pos in range(0, length + 1): 
      line_a = characters[:length] 
      line_b = line_a[:pos] + 'A' + line_a[pos:] 
      diff = list(differ.compare([line_a], [line_b])) 
      if len(diff) == 2 and diff[0][0] == '-' and diff[1][0] == '+': 
       marker = 'N' # Insertion not detected 
      elif len(diff) == 3 and diff[0][0] == '-' and diff[1][0] == '+' and diff[2][0] == '?': 
       marker = 'Y' # Insertion detected 
      else: 
       print('ERROR: unexpected diff for %r -> %r:\n%r' % (line_a, line_b, diff)) 
       return 
      print('%s %r -> %r' % (marker, line_a, line_b)) 

show_diffs(limit=3) 

Он «не может» только для 1-символьных строк:

N 'a' -> 'Aa' 
N 'a' -> 'aA' 
Y 'ab' -> 'Aab' 
Y 'ab' -> 'aAb' 
Y 'ab' -> 'abA' 
Y 'abc' -> 'Aabc' 
Y 'abc' -> 'aAbc' 
Y 'abc' -> 'abAc' 
Y 'abc' -> 'abcA' 
+0

благодаря больной просто обрабатывать этот край случай – ealeon

 Смежные вопросы

  • Нет связанных вопросов^_^