程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

Python:difflib.SequenceMatcher比較文本內容,返回差異部分

編輯:Python

運用到的知識點:

s=difflib.SequenceMatcher(isjunk=None,a,b, autojunk=True) :構造函數,主要創建任何類型序列的比較對象。
isjunk是關鍵字參數,主要設置過濾函數,如想丟掉a和b比較序列裡特定的字符,就可以設置相應的函數

s.get_opcodes()函數每執行一次返回5個元素的元組,元組描述了a和b比較序列的相同不同處。5個元素的元組表示為(tag, i1, i2, j1, j2),其中tag表示動作,i1表示序列a的開始位置,i2表示序列a的結束位置,j1表示序列b的開始位置,j2表示序列b的結束位置。
tag表示的字符串為:
replace 表示a[i1 : i2]將要被b[j1 : j2]替換。
delete  表示a[i1 : i2]將要被刪除。
insert  表示b[j1 : j2]將被插入到a[i1 : i1]地方。
equal  表示a[i1 : i2] == b[j1 : j2]相同。

string.maketrans(instr,outstr)返回一個翻譯表,instr中的字符是需要被outstr中的字符替換,而且instr和outstr的長度必須相等
str.maketrans(intab, outtab)方法用於創建字符映射的轉換表,對於接受兩個參數的最簡單的調用方式,第一個參數是字符串,表示需要轉換的字符,第二個參數也是字符串表示轉換的目標。兩個字符串的長度必須相同,為一一對應的關系。

import xlrd,re
import difflib
def E_trans_to_C(string):#英文符號轉換為中文符號
E_pun = u',.!?[]()<>"\''
C_pun = u',。!?【】()《》“‘'
trantab = str.maketrans(E_pun, C_pun) # 制作翻譯表
return string.translate(trantab)
def change_txt(st):#轉換文本:去除空格、去除符號、中英字符轉換等
# # 去除字符串開頭或者結尾的空格
# new_st = st.strip()
# 去除全部空格
new_st = ''.join(E_trans_to_C(st).split(' '))
# 中英符號:將文本中所有符號轉換為中文符號
# 大小寫轉換
# new_st = st.upper()
# new_st = st.lower()
return new_st
data = xlrd.open_workbook(r'D:\工作內容\content423.xlsx')
table = data.sheets()[0]
log=''
for i in range(1,table.nrows):
row_value = table.row_values(i)
txt1=row_value[1]
txt2=row_value[2]
s = difflib.SequenceMatcher(None, txt1, txt2)
# s = difflib.SequenceMatcher(None, change_txt(txt1), change_txt(txt2))
cw_num=0
for tag, i1, i2, j1, j2 in s.get_opcodes():
# print ("%7s a[%d:%d] (%s) b[%d:%d] (%s)" % (tag, i1, i2, a[i1:i2], j1, j2, b[j1:j2]))
if tag != 'equal':
print("%7s a[%d:%d] (%s) b[%d:%d] (%s)" % (tag, i1, i2, txt1[i1:i2], j1, j2, txt2[j1:j2]))
log += ("%7s a[%d:%d] (%s) b[%d:%d] (%s)" % (tag, i1, i2, txt1[i1:i2], j1, j2, txt2[j1:j2]) + '\n')
if len(txt1[i1:i2]) > len(txt2[j1:j2]):
cw_num += len(txt1[i1:i2])
else:
cw_num += len(txt2[j1:j2])
print("{}檢測存在差異的字數:{}".format(row_value[0],cw_num))
log += ("{}檢測存在差異的字數:{}".format(row_value[0],cw_num) + '\n')
log += ("==============================================" + '\n')
with open(r'D:\工作內容\content423_log.txt', 'w', encoding="UTF-8") as f:
f.write(log + '\n')

返回結果: (僅供參考)

 


  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved