Python Difflib — Как получить различные последовательности, такие как формат PHP Diff Class

Я читаю документацию по python difflib. Согласно выводу difflib.differ это:

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

Я также читаю этот вопрос на stackoverflow
Python Difflib — Как получить последовательности SDiff с "+ Изменить" Op но не сможет добавить комментарий на Sнаđошƒаӽответ.

Я не знаю, что такое Perl’s 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

быть как 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

Решение

Я думаю, что я сделал то, что я хочу, как вывод 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
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]