python正則中最短匹配實(shí)現(xiàn)代碼
下面從一個(gè)例子入手:
利用正則表達(dá)式解析下面的XML/HTML標(biāo)簽:
<composer>Wolfgang Amadeus Mozart</composer> <author>Samuel Beckett</author> <city>London</city>
希望自動(dòng)格式化重寫為:
composer: Wolfgang Amadeus Mozart
author: Samuel Beckett
city: London
一個(gè)代碼是這樣的形式:
#coding:utf-8 import re s="""<composer>WolfgangAmadeus Mozart</composer> <author>SamuelBeckett</author> <city>London</city>""" pattern1=re.compile("<\w+>") #匹配<>中任意的字符 pattern2=re.compile(">.+</") #匹配><中任意的字符 listNames=pattern1.findall(s) #獲取所有滿足正則表達(dá)式pattern1的字符串的列表 listContents=pattern2.findall(s) #獲取所有滿足正則表達(dá)式pattern2的字符串的列表 #由于xml是規(guī)范的,所以是一一對(duì)應(yīng)(對(duì)于錯(cuò)誤輸入,暫時(shí)不考慮) for i in range(len(listNames)): #輸出的時(shí)候利用切片丟棄多余的符號(hào),如:<>/ print(listNames[i][1:len(listNames[i])-1],":", listContents[i][1:len(listContents[i])-2])
這個(gè)代碼運(yùn)行后結(jié)果是可以的。
下面我們修改下s的格式:
#coding:utf-8 import re s="<composer>Wolfgang Amadeus Mozart</composer> <author>Samuel Beckett</author> <city>London</city>" pattern1=re.compile("<\w+>") #匹配<>中任意的字符 # 此模式為非貪婪模式,所以s不是多行也可以匹配 pattern2=re.compile(">.+</") #匹配><中任意的字符,問(wèn)號(hào)必須加,"?"是非貪婪匹配 listNames=pattern1.findall(s) #獲取所有滿足正則表達(dá)式pattern1的字符串的列表 listContents=pattern2.findall(s) #獲取所有滿足正則表達(dá)式pattern2的字符串的列表 #由于xml是規(guī)范的,所以是一一對(duì)應(yīng)(對(duì)于錯(cuò)誤輸入,暫時(shí)不考慮) for i in range(len(listNames)): #輸出的時(shí)候利用切片丟棄多余的符號(hào),如:<>/ print(listNames[i][1:len(listNames[i])-1],":", listContents[i][1:len(listContents[i])-2])
得到的答案如下所示:
我們打印一下匹配到的兩個(gè)結(jié)果看一下,修改代碼如下:
#coding:utf-8 import re s="<composer>Wolfgang Amadeus Mozart</composer> <author>Samuel Beckett</author> <city>London</city>" pattern1=re.compile("<\w+>") #匹配<>中任意的字符 # 此模式為非貪婪模式,所以s不是多行也可以匹配 pattern2=re.compile(">.+</") #匹配><中任意的字符,問(wèn)號(hào)必須加,"?"是非貪婪匹配 listNames=pattern1.findall(s) #獲取所有滿足正則表達(dá)式pattern1的字符串的列表 listContents=pattern2.findall(s) #獲取所有滿足正則表達(dá)式pattern2的字符串的列表 print(listNames) print(listContents) #由于xml是規(guī)范的,所以是一一對(duì)應(yīng)(對(duì)于錯(cuò)誤輸入,暫時(shí)不考慮) for i in range(len(listNames)): #輸出的時(shí)候利用切片丟棄多余的符號(hào),如:<>/ print(listNames[i][1:len(listNames[i])-1],":", listContents[i][1:len(listContents[i])-2])
顯示結(jié)果如下:
從第一個(gè)箭頭顯示可以看出,這個(gè)處理是對(duì)的,那么看第二個(gè)箭頭,這個(gè)匹配的結(jié)果顯然是不對(duì)的了,那么是什么原因呢?
這是因?yàn)樵谡齽t中,‘*'、‘+'、‘?'這些是貪婪匹配,如用 a*,操作結(jié)果是盡可能多地匹配模式。所以當(dāng)你試著匹配一對(duì)對(duì)稱的定界符,如 HTML 標(biāo)志中的尖括號(hào)。匹配單個(gè) HTML 標(biāo)志的模式不能正常工作,因?yàn)?.* 的本質(zhì)是“貪婪”的 。在這種情況下,解決方案是使用不貪婪的限定符 *?、+?、?? 或 {m,n}?,盡可能匹配小的文本。
那么代碼可以修改如下:
#coding:utf-8 import re s="<composer>Wolfgang Amadeus Mozart</composer> <author>Samuel Beckett</author> <city>London</city>" pattern1=re.compile("<\w+?>") #匹配<>中任意的字符 # 此模式為非貪婪模式,所以s不是多行也可以匹配 pattern2=re.compile(">.+?</") #匹配><中任意的字符,問(wèn)號(hào)必須加,"?"是非貪婪匹配 listNames=pattern1.findall(s) #獲取所有滿足正則表達(dá)式pattern1的字符串的列表 listContents=pattern2.findall(s) #獲取所有滿足正則表達(dá)式pattern2的字符串的列表 #由于xml是規(guī)范的,所以是一一對(duì)應(yīng)(對(duì)于錯(cuò)誤輸入,暫時(shí)不考慮) for i in range(len(listNames)): #輸出的時(shí)候利用切片丟棄多余的符號(hào),如:<>/ print(listNames[i][1:len(listNames[i])-1],":", listContents[i][1:len(listContents[i])-2])
最后,用分組對(duì)代碼的正則進(jìn)行優(yōu)化一下,如下:
#coding:utf-8 import re s="<composer>Wolfgang Amadeus Mozart</composer><author>Samuel Beckett</author><city>London</city>" pattern1=re.compile("<(\w+?)>") #匹配<>中任意的字符 # 此模式為非貪婪模式,所以s不是多行也可以匹配 pattern2=re.compile("<\w+?>(.+?)</\w+?>") #匹配<a>...</a>中任意的字符,問(wèn)號(hào)必須加,"?"是非貪婪匹配 listNames=pattern1.findall(s) #獲取所有滿足正則表達(dá)式pattern1的字符串的列表 listContents=pattern2.findall(s) #獲取所有滿足正則表達(dá)式pattern2的字符串的列表 #由于xml是規(guī)范的,所以是一一對(duì)應(yīng)(對(duì)于錯(cuò)誤輸入,暫時(shí)不考慮) for i in range(len(listNames)): print(listNames[i],":", listContents[i])
這篇文章就介紹到這,大家可以多參考腳本之家以前發(fā)布的關(guān)于python 正則表達(dá)式的相關(guān)內(nèi)容。
相關(guān)文章
Python機(jī)器學(xué)習(xí)之使用Pyecharts制作可視化大屏
pyecharts是一個(gè)用于生成Echarts圖表的Python庫(kù),Echarts是百度開(kāi)源的一個(gè)數(shù)據(jù)可視化 JS 庫(kù),可以生成一些非??犰诺膱D表,這篇文章主要給大家介紹了關(guān)于Python機(jī)器學(xué)習(xí)之Pyecharts制作可視化大屏的相關(guān)資料,需要的朋友可以參考下2021-10-10基于Python實(shí)現(xiàn)層次性數(shù)據(jù)和閉包性質(zhì)
這篇文章主要介紹了如何利用Python實(shí)現(xiàn)層次性數(shù)據(jù)和閉包性質(zhì),文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Python有一定幫助,需要的可以了解一下2022-05-05啥是佩奇?使用Python自動(dòng)繪畫小豬佩奇的代碼實(shí)例
今天小編就為大家分享一篇關(guān)于啥是佩奇?使用Python自動(dòng)繪畫小豬佩奇的代碼實(shí)例,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-02-02Python 使用pandas實(shí)現(xiàn)查詢和統(tǒng)計(jì)示例詳解
這篇文章主要為大家介紹了Python 使用pandas實(shí)現(xiàn)查詢和統(tǒng)計(jì)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-08-08Python常用模塊logging——日志輸出功能(示例代碼)
logging模塊是Python的內(nèi)置模塊,主要用于輸出運(yùn)行日志,可以靈活配置輸出日志的各項(xiàng)信息。這篇文章主要介紹了Python常用模塊logging——日志輸出的實(shí)例代碼,需要的朋友可以參考下2019-11-11GPU排隊(duì)腳本實(shí)現(xiàn)空閑觸發(fā)python腳本實(shí)現(xiàn)示例
有的服務(wù)器是多用戶使用,GPU的資源常常被占據(jù)著,很可能在夜間GPU空閑了,但來(lái)不及運(yùn)行自己的腳本。如果沒(méi)有和別人共享服務(wù)器的話,自己的多個(gè)程序想排隊(duì)使用GPU,也可以用這個(gè)腳本2021-11-11Python 棧實(shí)現(xiàn)的幾種方式及優(yōu)劣詳解
這篇文章主要為大家介紹了Python 棧實(shí)現(xiàn)的幾種方式及優(yōu)劣詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-10-10selenium?UI自動(dòng)化實(shí)戰(zhàn)過(guò)程記錄
如果大家有做過(guò)web的自動(dòng)化測(cè)試,相信對(duì)于selenium一定不陌生,測(cè)試人員經(jīng)常使用它來(lái)進(jìn)行自動(dòng)化測(cè)試,下面這篇文章主要給大家介紹了關(guān)于selenium?UI自動(dòng)化實(shí)戰(zhàn)的相關(guān)資料,需要的朋友可以參考下2021-12-12