Объединить две многострочные строки, как git делает - PullRequest
0 голосов
/ 08 апреля 2020

Я бы хотел «объединить» две (обычно очень похожие) многострочные строки (близко к тому, что делает git, когда объединяет изменения в файлах).

Что-то вроде

>>> combine([
    'Hello,',
    'this is a text hat has been altered on one place',
    'while altered differently on another',],[
    'Hello,',
    'this is another text hat has been altered on a different place',
    'while altered differently on another',])
['Hello,',
 'this is another text hat has been altered on a different place',
 'this is a text hat has been altered on one place',
 'while altered differently on another',]

У меня недостаточно информации для трехсторонней разницы, поэтому я хотел бы найти сходства и убедиться, что ни одна строка не потеряна.

Я нашел несколько ручных подходов с использованием set и скоро. Но мне нужен способ сохранить порядок , аналогичные разделы и множественные вхождения идентичных (т. Е. Пустых) строк.

Есть ли 'pythoni c' ( Короче, элегантно, изощренно) как это сделать?

1 Ответ

1 голос
/ 08 апреля 2020

Если у вас есть только два элемента (списки), это должно работать:

def combine(target):
  return target[0]+list(x for x in target[1] if x not in target[0])

Это добавляет первый элемент с элементами, которые находятся во втором элементе, но не в первом.

Позднее редактирование:

Я не использовал difflib много, но это дает правильный результат для меня.

import difflib

def merge_text(text1:str, text2:str) -> str:
    return "\n".join(
        line[2:] for line in difflib.Differ().compare(
            text1.split("\n"),
            text2.split("\n")) 
        if not line.startswith("?"))
...