Python3如何實現(xiàn)列表模糊匹配列表
Python3列表模糊匹配列表
B列表模糊匹配A列表
a = ['123','666','355'] b = ['2','5'] for i in range(len(b)): for j in range(len(a)): if a[j].find(b[i]) == -1: continue print(a[j])
執(zhí)行結果:
Python 模糊匹配搜索問題
利用python庫:fuzzywuzzy及difflib,兩個庫均可實現(xiàn)詞粒度的模糊匹配,同時可設定模糊閾值,實現(xiàn)關鍵詞的提取、地址匹配、語法檢查等
fuzzywuzzy
pip install fuzzywuzzy from fuzzywuzzy import process from fuzzywuzzy import fuzz
fuzzy模塊
(1)模糊匹配方法
ratio()
——簡單匹配,使用純Levenshtein Distance進行匹配。partial_ratio()
——非完全匹配,基于最佳的子串(substrings)進行匹配token_set_ratio
——忽略順序匹配,對字符串進行標記(tokenizes)并在匹配之前按字母順序?qū)λ鼈冞M行排序token_set_ratio
——去重子集匹配,對字符串進行標記(tokenizes)并比較交集和余數(shù)
(2)實例
ratio() 簡單匹配
fuzz.ratio("河南省", "河南省") >>> 100 fuzz.ratio("河南", "河南省") >>> 80
partial_ratio() 非完全匹配
fuzz.partial_ratio("河南省", "河南省") >>> 100 fuzz.partial_ratio("河南", "河南省") >>> 100
token_set_ratio() 忽略順序匹配
fuzz.ratio("西藏 自治區(qū)", "自治區(qū) 西藏") >>> 50 fuzz.ratio('I love YOU','YOU LOVE I') >>> 30 fuzz.token_sort_ratio("西藏 自治區(qū)", "自治區(qū) 西藏") >>> 100 fuzz.token_sort_ratio('I love YOU','YOU LOVE I') >>> 100
token_set_ratio() 去重子集匹配
fuzz.ratio("西藏 西藏 自治區(qū)", "自治區(qū) 西藏") >>> 40 fuzz.token_sort_ratio("西藏 西藏 自治區(qū)", "自治區(qū) 西藏") >>> 80 fuzz.token_set_ratio("西藏 西藏 自治區(qū)", "自治區(qū) 西藏") >>> 100
process模塊
(1) extract提取多條數(shù)據(jù)
類似于爬蟲中select,返回的是列表,其中會包含很多匹配的數(shù)據(jù)
choices = ["河南省", "鄭州市", "湖北省", "武漢市"] process.extract("鄭州", choices, limit=2) >>> [('鄭州市', 90), ('河南省', 0)] # extract之后的數(shù)據(jù)類型是列表,即使limit=1,最后還是列表,注意和下面extractOne的區(qū)別
(2)extractOne提取一條數(shù)據(jù)
提取匹配度最大的結果,返回 元組 類型, 還有就是匹配度最大的結果不一定是我們想要的數(shù)據(jù),可以通過下面的示例和兩個實戰(zhàn)應用體會一下
process.extractOne("鄭州", choices) >>> ('鄭州市', 90) process.extractOne("北京", choices) >>> ('湖北省', 45)
difflib
Difflib作為python的標準庫,difflib模塊提供的類和方法用來進行序列的差異化比較,它能夠比對文件并生成差異結果文本或者html格式的差異化比較頁面,而且支持輸出可讀性比較強的HTML文檔
(0)get_close_matches(word, possibilities, n=3, cutoff=0.6)
import difflib config_list = ['中國工商銀行','中國農(nóng)業(yè)銀行','建設銀行','中國人民銀行','招商證券','中國農(nóng)業(yè)發(fā)展銀行'] query_word = '農(nóng)行' res = difflib.get_close_matches(query_word, config_list, 1, cutoff=0.5) print(res) >>>['中國農(nóng)業(yè)銀行']
擴展——文件比較
(1)difflib.Differ
此類比較的是文本行的差異并且產(chǎn)生適合人類閱讀的差異結果或者增量結果,結果中各部分的表示如下:
(2)difflib.HtmlDiff
make_file(fromlines, tolines [, fromdesc][, todesc][, context][, numlines]) make_table(fromlines, tolines [, fromdesc][, todesc][, context][, numlines])
此類可以被用來創(chuàng)建HTML表格 (或者說包含表格的html文件) ,兩邊對應展示或者行對行的展示比對差異結果。以上兩個方法都可以用來生成包含一個內(nèi)容為比對結果的表格的html文件,并且部分內(nèi)容會高亮顯示。
(3)context_diff
difflib.context_diff(a, b[, fromfile][, tofile][, fromfiledate][, tofiledate][, n][, lineterm])
比較a與b(字符串列表),并且返回一個差異文本行的生成器
>>> s1 = ['bacon\n', 'eggs\n', 'ham\n', 'guido\n'] >>> s2 = ['python\n', 'eggy\n', 'hamster\n', 'guido\n'] >>> for line in context_diff(s1, s2, fromfile='before.py', tofile='after.py'): ... sys.stdout.write(line) *** before.py --- after.py *************** *** 1,4 **** ! bacon ! eggs ! ham guido --- 1,4 ---- ! python ! eggy ! hamster guido
(4) 比對兩個文件,然后生成一個展示差異結果的HTML文件
import difflib hd = difflib.HtmlDiff() file1 = '' with open('xxx1.py','r') as load: file1 = load.readlines() load.close() file2 = '' with open('xxx2', 'r') as mem: file2 = mem.readlines() mem.close() with open('htmlout.html','a+') as fo: fo.write(hd.make_file(file1,file2)) fo.close()
總結:difflib多用于文本的差異比較,用于模糊匹配精度還是不太準的,一般詞的模糊匹配可用fuzzywuzzy
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
讓python json encode datetime類型
python2.6+ 自帶的json模塊,不支持datetime的json encode,每次都需要手動轉(zhuǎn)為字符串,很累人,我們可以自己封裝一個簡單的方法處理此問題。2010-12-12Linux安裝Python3如何和系統(tǒng)自帶的Python2并存
這篇文章主要介紹了Linux安裝Python3如何和系統(tǒng)自帶的Python2并存,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-07-07python中內(nèi)置函數(shù)ord()返回字符串的ASCII數(shù)值實例詳解
ord()?函數(shù)是?chr()?函數(shù)(對于?8?位的?ASCII?字符串)的配對函數(shù),它以一個字符串(Unicode?字符)作為參數(shù),返回對應的?ASCII?數(shù)值,或者?Unicode?數(shù)值,這篇文章主要介紹了python?中內(nèi)置函數(shù)ord()返回字符串的ASCII數(shù)值,需要的朋友可以參考下2022-07-07