Liquidsのロゴ Liquids

diff-match-patchで差分を扱う【Python】

Python

差分を扱うためのライブラリであるdiff-match-patchをPythonで扱うためのWikiです。

diff-match-patch自体はC++, C#, Dart, Java, JavaScriptなどPython以外の言語でも利用することができます。

pip install diff-match-patch

差分はdiff_mainで作成できます。

import diff_match_patch

dmp = diff_match_patch.diff_match_patch()

text1: str = 'How to get diff of two text ?'
text2: str = 'How to calculate diff of two text ? Do you know ?'
# 差分の作成
diff = dmp.diff_main(text1, text2)

diffの結果は以下のとおりです。text1からtext2への差分を表しています。

[(0, 'How to '), (-1, 'ge'), (1, 'calcula'), (0, 't'), (1, 'e'), (0, ' diff of two text ?'), (1, ' Do you know ?')]

数値の意味するところは次のとおりです。

  • 0:差分なし
  • 1:追加
  • -1:削除

確かにtext1へ差分を適用すると、text2を表すことができます。

パッチの作成はpatch_makeで作成ができ、パッチのオブジェクトの配列が生成されます。patch_makediff_mainで生成したような差分から生成することもできますし、直接patch_make(text1, text2)のような形で使用することもできます。

import diff_match_patch

dmp = diff_match_patch.diff_match_patch()

text1: str = 'How to get diff of two text ?'
text2: str = 'How to calculate diff of two text ? Do you know ?'
# 差分の作成
diff = dmp.diff_main(text1, text2)
# パッチの作成
patch = dmp.patch_make(diff)

patchの内容は以下の通り

[<diff_match_patch.diff_match_patch.patch_obj object at 0x100cd9eb0>, <diff_match_patch.diff_match_patch.patch_obj object at 0x100cfe100>]

また、それぞれのパッチの中身を見る(printで表示)と、次のようになっています。

@@ -4,11 +4,17 @@
  to 
-ge
+calcula
 t
+e
  dif
@@ -28,8 +28,22 @@
 o text ?
+ Do you know ?

patch_toTextを使うことで、パッチを一連のテキストにすることができます。

import diff_match_patch

dmp = diff_match_patch.diff_match_patch()

text1: str = 'How to get diff of two text ?'
text2: str = 'How to calculate diff of two text ? Do you know ?'
# 差分の作成
diff = dmp.diff_main(text1, text2)
# パッチの作成
patch = dmp.patch_make(diff)
# テキストへ
patch_text = dmp.patch_toText(dmp.patch_make(diff))
@@ -4,11 +4,17 @@
  to 
-ge
+calcula
 t
+e
  dif
@@ -28,8 +28,22 @@
 o text ?
+ Do you know ?

パッチから復元するにはpatch_applyを使用します。

適用するパッチと、パッチが適用されるテキストを与えます。

import diff_match_patch

dmp = diff_match_patch.diff_match_patch()

text1: str = 'How to get diff of two text ?'
text2: str = 'How to calculate diff of two text ? Do you know ?'
# 差分の作成
diff = dmp.diff_main(text1, text2)
# パッチの作成
patch = dmp.patch_make(diff)
# パッチから復縁する
restored_text2 = dmp.patch_apply(patch, text1)
('How to calculate diff of two text ? Do you know ?', [True, True])

復元されたテキストと、どのパッチが正常に適用されたかを表すTrue/Falseの配列が得られます。

ただし、パッチの正常に適用されたかを表すTrue/Falseの配列はあまり有用でないと述べられています。

[Note that this second element is not too useful since large patches may get broken up internally, resulting in a longer results list than the input with no way to figure out which patch succeeded or failed. A more informative API is in development.]

Liquidsのロゴ Liquids

Liquidsは誰でも投稿・編集ができる技術Wikiコミュニティ📝です。

あなたもLiquidsで技術Wikiを
書いてみませんか?