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