"diff -u -B -w" в python?

Используя Python, я хотел бы вывести разницу между двумя строками как унифицированный diff (-u), в то время как, необязательно, игнорируя пустые строки (-B) и пробелы (-w).

Поскольку строки были созданы внутренне, я бы предпочел не заниматься тонкой сложностью написания одной или обеих строк в файле, запуском GNU diff, фиксацией вывода и окончательной очистки.

В то время как difflib.unified_diff генерирует унифицированные различия, он, похоже, не позволяет мне настраивать, как обрабатываются пробелы и пустые строки. Я рассмотрел его реализацию и, как я подозреваю, единственным решением является копирование/взломать это тело функции.

Есть ли что-нибудь лучше?

На данный момент я снимаю символы пэда, используя что-то вроде:

import difflib
import re
import sys

l = "line 1\nline 2\nline 3\n"
r = "\nline 1\n\nline 2\nline3\n"
strip_spaces = True
strip_blank_lines = True

if strip_spaces:
    l = re.sub(r"[ \t]+", r"", l)
    r = re.sub(r"[ \t]+", r"", r)
if strip_blank_lines:
    l = re.sub(r"^\n", r"", re.sub(r"\n+", r"\n", l))
    r = re.sub(r"^\n", r"", re.sub(r"\n+", r"\n", r))
# run diff
diff = difflib.unified_diff(l.splitlines(keepends=True), r.splitlines(keepends=True))
sys.stdout.writelines(list(diff))

что, конечно же, приводит к выходу для описания чего-то другого, кроме исходного. Например, передайте вышеприведенный текст в GNU diff 3.3, как "diff -u -w", а "строка 3" отображается как часть контекста, выше будет отображаться "строка3".

Ответ 1

Сделайте свой собственный SequenceMatcher, скопируйте тело unified_diff и замените SequenceMatcher на свой собственный матчи.