Python3如何實(shí)現(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í)行結(jié)果:
Python 模糊匹配搜索問(wèn)題
利用python庫(kù):fuzzywuzzy及difflib,兩個(gè)庫(kù)均可實(shí)現(xiàn)詞粒度的模糊匹配,同時(shí)可設(shè)定模糊閾值,實(shí)現(xiàn)關(guān)鍵詞的提取、地址匹配、語(yǔ)法檢查等
fuzzywuzzy
pip install fuzzywuzzy from fuzzywuzzy import process from fuzzywuzzy import fuzz
fuzzy模塊
(1)模糊匹配方法
ratio()
——簡(jiǎn)單匹配,使用純Levenshtein Distance進(jìn)行匹配。partial_ratio()
——非完全匹配,基于最佳的子串(substrings)進(jìn)行匹配token_set_ratio
——忽略順序匹配,對(duì)字符串進(jìn)行標(biāo)記(tokenizes)并在匹配之前按字母順序?qū)λ鼈冞M(jìn)行排序token_set_ratio
——去重子集匹配,對(duì)字符串進(jìn)行標(biāo)記(tokenizes)并比較交集和余數(shù)
(2)實(shí)例
ratio() 簡(jiǎn)單匹配
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ù)
類(lèi)似于爬蟲(chóng)中select,返回的是列表,其中會(huì)包含很多匹配的數(shù)據(jù)
choices = ["河南省", "鄭州市", "湖北省", "武漢市"] process.extract("鄭州", choices, limit=2) >>> [('鄭州市', 90), ('河南省', 0)] # extract之后的數(shù)據(jù)類(lèi)型是列表,即使limit=1,最后還是列表,注意和下面extractOne的區(qū)別
(2)extractOne提取一條數(shù)據(jù)
提取匹配度最大的結(jié)果,返回 元組 類(lèi)型, 還有就是匹配度最大的結(jié)果不一定是我們想要的數(shù)據(jù),可以通過(guò)下面的示例和兩個(gè)實(shí)戰(zhàn)應(yīng)用體會(huì)一下
process.extractOne("鄭州", choices) >>> ('鄭州市', 90) process.extractOne("北京", choices) >>> ('湖北省', 45)
difflib
Difflib作為python的標(biāo)準(zhǔn)庫(kù),difflib模塊提供的類(lèi)和方法用來(lái)進(jìn)行序列的差異化比較,它能夠比對(duì)文件并生成差異結(jié)果文本或者h(yuǎn)tml格式的差異化比較頁(yè)面,而且支持輸出可讀性比較強(qiáng)的HTML文檔
(0)get_close_matches(word, possibilities, n=3, cutoff=0.6)
import difflib config_list = ['中國(guó)工商銀行','中國(guó)農(nóng)業(yè)銀行','建設(shè)銀行','中國(guó)人民銀行','招商證券','中國(guó)農(nóng)業(yè)發(fā)展銀行'] query_word = '農(nóng)行' res = difflib.get_close_matches(query_word, config_list, 1, cutoff=0.5) print(res) >>>['中國(guó)農(nóng)業(yè)銀行']
擴(kuò)展——文件比較
(1)difflib.Differ
此類(lèi)比較的是文本行的差異并且產(chǎn)生適合人類(lèi)閱讀的差異結(jié)果或者增量結(jié)果,結(jié)果中各部分的表示如下:
(2)difflib.HtmlDiff
make_file(fromlines, tolines [, fromdesc][, todesc][, context][, numlines]) make_table(fromlines, tolines [, fromdesc][, todesc][, context][, numlines])
此類(lèi)可以被用來(lái)創(chuàng)建HTML表格 (或者說(shuō)包含表格的html文件) ,兩邊對(duì)應(yīng)展示或者行對(duì)行的展示比對(duì)差異結(jié)果。以上兩個(gè)方法都可以用來(lái)生成包含一個(gè)內(nèi)容為比對(duì)結(jié)果的表格的html文件,并且部分內(nèi)容會(huì)高亮顯示。
(3)context_diff
difflib.context_diff(a, b[, fromfile][, tofile][, fromfiledate][, tofiledate][, n][, lineterm])
比較a與b(字符串列表),并且返回一個(gè)差異文本行的生成器
>>> 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) 比對(duì)兩個(gè)文件,然后生成一個(gè)展示差異結(jié)果的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()
總結(jié):difflib多用于文本的差異比較,用于模糊匹配精度還是不太準(zhǔn)的,一般詞的模糊匹配可用fuzzywuzzy
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
100?個(gè)?Python?小例子(練習(xí)題四)
這篇文章主要給大家分享100?個(gè)?Python?小例子,前文分享了一二三,本文的四十最后一篇了,這篇就把100道python小練習(xí)全分享完了,感興趣的小伙伴也可以去練習(xí)前幾期內(nèi)容,洗碗給這幾篇文章給你的學(xué)習(xí)帶來(lái)幫助2022-01-01python簡(jiǎn)單實(shí)現(xiàn)9宮格圖片實(shí)例
在本篇內(nèi)容里小編給各位分享的是一篇關(guān)于python實(shí)現(xiàn)朋友圈中的九宮格圖片的實(shí)例講解,有需要的朋友們可以參考下。2020-09-09OpenCV利用手勢(shì)識(shí)別實(shí)現(xiàn)虛擬拖放效果
這篇文章主要介紹了利用OpenCV實(shí)現(xiàn)手勢(shì)識(shí)別,從而進(jìn)行虛擬拖放效果,我們可以使用這個(gè)技術(shù)實(shí)現(xiàn)一些游戲,控制機(jī)械臂等很多有趣的事情。感興趣的可以學(xué)習(xí)一下2022-01-01關(guān)于opencv讀取和寫(xiě)入路徑有漢字的處理方式
這篇文章主要介紹了關(guān)于opencv讀取和寫(xiě)入路徑有漢字的處理方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-07-07讓python json encode datetime類(lèi)型
python2.6+ 自帶的json模塊,不支持datetime的json encode,每次都需要手動(dòng)轉(zhuǎn)為字符串,很累人,我們可以自己封裝一個(gè)簡(jiǎn)單的方法處理此問(wèn)題。2010-12-12Linux安裝Python3如何和系統(tǒng)自帶的Python2并存
這篇文章主要介紹了Linux安裝Python3如何和系統(tǒng)自帶的Python2并存,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-07-07python中內(nèi)置函數(shù)ord()返回字符串的ASCII數(shù)值實(shí)例詳解
ord()?函數(shù)是?chr()?函數(shù)(對(duì)于?8?位的?ASCII?字符串)的配對(duì)函數(shù),它以一個(gè)字符串(Unicode?字符)作為參數(shù),返回對(duì)應(yīng)的?ASCII?數(shù)值,或者?Unicode?數(shù)值,這篇文章主要介紹了python?中內(nèi)置函數(shù)ord()返回字符串的ASCII數(shù)值,需要的朋友可以參考下2022-07-07講解如何利用 Python完成 Saga 分布式事務(wù)
這篇文章主要介紹了如何利用 Python 完成一個(gè) Saga 的分布式事務(wù),需要的朋友可以參考下面文章具體的內(nèi)容2021-09-09