[Python] difflibモジュールを使用した文字列比較

[Python] 二つの文字列を比較する:等しい、等しくない、関係演算を理解するで、文字列を比較するためのさまざまな手法を探求しました。今度は、より長いテキストの検査を一歩進め、正確な違いを特定します。このブログ投稿では、Pythonのdifflibモジュールを用いて、大量のテキストを分析・比較する手引きをします。これは、複雑なデータ比較を扱う者にとって貴重なツールとなるでしょう。

SequenceMatcherを用いた文字列の比較

difflibモジュールのSequenceMatcherクラスは、二つの文字列を比較し、それらの間の類似性の比率を識別するために使用できます。

python
from difflib import SequenceMatcher

string1 = "The sun rises in the east\nA stitch in time saves nine\nAll that glitters is not gold"
string2 = "The sun sets in the west\nA stitch in time saves nine\nAll that shines is not gold\n"

s = SequenceMatcher(None, string1, string2)
similarity_ratio = s.ratio()

print(similarity_ratio)  # 输出:0.9146341463414634

このコードスニペットは、二つの文字列を比較し、類似比率を得る方法を示しています。これは、テキスト間のわずかな相違を素早く特定する便利な方法です。

Differを活用した行ごとのテキスト比較

difflibモジュールのDifferクラスにより、より大きなテキスト文書を行ごとに比較することが可能です。

python
from difflib import Differ

text1 = string1.split('\n')
text2 = string2.split('\n')

d = Differ()
diff = d.compare(text1, text2)

print('\n'.join(diff))

出力

- The sun rises in the east
?         --            -

+ The sun sets in the west
?           +         +

  A stitch in time saves nine

- All that glitters is not gold
?          ^^ ^^ -

+ All that shines is not gold
?          ^^ ^
``` ^^ ^

与えられたコードスニペットでは、difflibモジュールのDifferクラスが、二つの文字列のシーケンス、text1およびtext2を比較するために使用されます。コードの出力は、これら二つのシーケンス間の違いを強調し、それぞれの違いの性質を示す特定の記号を使用します。

提供された出力を解説します:

  1. The sun rises/sets line: -行は、text1には「東に日は昇る」があるが、text2にはないことを示しています。+行は、text2に「西に日は沈む」があるが、text1にはないことを示します。?行は、変更された正確な文字を特定します。
  2. 同一の行: 「時は金なりと急ぐ」は、text1text2の両方で同じなので、最初に記号はありません。
  3. The glitters/shines line: 最初の行と同様に、-+?の行は、text1の「すべての光るものが金ではない」がtext2の「すべての輝くものが金ではない」に置き換えられ、具体的な変更が強調されています。

FAQs

  1. difflibでバイナリファイルを比較できますか? いいえ、difflibモジュールはテキスト行のシーケンスを比較するために意図されています。
  2. difflibはPythonのすべてのバージョンで利用できますか? difflibモジュールは、バージョン2.1以降のPython標準ライブラリで利用できます。
  3. HTMLファイルを比較するためにdifflibをどう使えますか? difflibモジュールのHtmlDiffクラスを使用して、HTMLの並べて比較する表を生成できます。
  4. 比較の出力をカスタマイズできますか? はい、Differのようなクラスは、比較の実行方法と出力の生成方法をカスタマイズするオプションを提供します。
  5. 二つの大きなテキスト間の変更を素早く見つける方法はありますか? はい、difflib.get_opcodes()メソッドを使用して、変更のブロックに関する情報を取得できます。これは、大量のテキストに対して便利です。
© Copyright 2023 CLONE CODING