2010-01-09 5 views
7

Все инструменты сравнения, которые я нашел, просто сравнивают строку за строкой, а не char char. Есть ли какая-либо библиотека, которая дает подробную информацию о строках одной строки? Может быть, и процентная разница, хотя я думаю, что для этого существуют отдельные функции?diff для отдельных строк

+0

Разве это не дубликат http://stackoverflow.com/questions/1721738/using-diff-or-anything-else-to-get-character-level-diff -between-text-файлы? –

ответ

5

Этот алгоритм дифференциалы слово за словом:

http://github.com/paulgb/simplediff

доступны в Python и PHP. Он может даже выплевывать HTML-формат с использованием тегов <ins> и <del>.

+0

Хорошо, но пробелы тоже должны иметь значение. Закладка, замененная пространством, будет разницей, которая не подхвачена этим. –

+0

Исходный код выглядит достаточно простым. Вы можете легко изменить его, чтобы разделить на пустую строку вместо пробела, чтобы вы могли различать по-символу. – slebetman

+0

На самом деле это работает потрясающе, передавая строки непосредственно diff(), а не через stringDiff(). Хорошо работает на основе char char, потому что строки - это последовательности в python. И с выходом функции легко работать. Я задаюсь вопросом о накладных расходах на поиск самой большой общей подстроки, хотя, когда каждый элемент является только одним символом ... хотя я могу не понимать код ... –

3

Что вы можете попробовать, так это разделить оба символа строки на символы на строки, а затем вы можете использовать diff. Это грязный хак, но по крайней мере он должен работать и его очень легко реализовать.

Альтернативно вы можете разделить строку на список символов в Python и использовать difflib. Проверка Python difflib reference

+0

Я подумал об этом, и он выглядит как «лучший» вариант. Я также рассмотрел возможность поиска в средствах сравнения строк и попытался заставить его рассматривать символы как строки вместо этого ... но я думал, что сначала проверю. –

+0

Это можно сделать легко 'diff <(cat file1 | tr" "" \ n ") <(cat fil2 | tr" "" \ n ")', но проблема в том, что вывод плохо отформатирован. Гораздо лучше сделать 'wdiff file1 file2' Спасибо @Michael Williamson ответ. –

+0

Ниже приведена посимвольная версия 'diff <(cat a1 | sed \ s /./ \ 0 \ n/'g) <(cat a2 | sed' /./ \ 0 \ n/'g) ' –

4

Я искал что-то подобное недавно и наткнулся на wdiff. Он работает на словах, а не на персонажах, но насколько это близко к тому, что вы ищете?

+0

Хорошо, но пробелы тоже должны иметь значение. Закладка, замещенная пробелом, будет разницей, не подхваченной этим (если разделить по пробелам). –

+1

wdiff кажется заброшенным с 1994 года. Он действительно работает, в основном. – lhf

+0

@lhf, это заброшено или просто нечего больше улучшать? –

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