[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 類別被用來比對兩個字串序列,text1text2。代碼的輸出突出了這兩個序列之間的差異,使用特定符號來指示每個差異的性質:

  • 以「-」開頭的行表示在 text1 中存在但 text2 中不存在的元素。
  • 以「+」開頭的行表示在 text2 中存在但 text1 中不存在的元素。
  • 在開頭沒有任何符號的行表示在兩個序列中都相同的元素。
  • 以「?」開頭的行顯示一行內變化的具體位置,用不同的字符突出變化的地方。

讓我們分析所提供的輸出:

  1. The sun rises/sets line: 「-」行表示 "The sun rises in the east" 在 text1 中,但不在 text2 中。 「+」行顯示 "The sun sets in the west" 在 text2 中,但不在 text1 中。 「?」行精確指出了已改變的字符。
  2. 相同的行: "A stitch in time saves nine" 在 text1text2 中是相同的,因此開頭沒有任何符號。
  3. The glitters/shines line: 類似於第一行,「-」、「+」和「?」行顯示 "All that glitters is not gold" 在 text1 中已被 "All that shines is not gold" 在 text2 中替換,並突出了具體的變化。

FAQs

  1. 我能用 difflib 比對二進制文件嗎? 不,difflib 模組是用來比對文字行序列的。
  2. difflib 是否適用於 Python 的所有版本? difflib 模組自 2.1 版開始在 Python 標準庫中提供。
  3. 如何使用 difflib 比對 HTML 文件? 您可以使用 difflib 模組的 HtmlDiff 類別生成 HTML 平行比較表。
  4. 我可以自訂比對的輸出嗎? 是的,像 Differ 這樣的類別提供選項來自訂比對的執行方式和輸出的生成方式。
  5. 是否有快速找出兩個大型文本間變化的方法? 是的,您可以使用 difflib.get_opcodes() 方法來獲取有關變化塊的資訊,這對於大型文本可能很有用。
© Copyright 2023 CLONE CODING