您好,登錄后才能下訂單哦!
這篇文章給大家分享的是有關python正則中最短匹配的示例分析的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。
下面從一個例子入手:
利用正則表達式解析下面的XML/HTML標簽:
<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是規范的,所以是一一對應(對于錯誤輸入,暫時不考慮) for i in range(len(listNames)): #輸出的時候利用切片丟棄多余的符號,如:<>/ print(listNames[i][1:len(listNames[i])-1],":", listContents[i][1:len(listContents[i])-2])
這個代碼運行后結果是可以的。
下面我們修改下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是規范的,所以是一一對應(對于錯誤輸入,暫時不考慮) for i in range(len(listNames)): #輸出的時候利用切片丟棄多余的符號,如:<>/ print(listNames[i][1:len(listNames[i])-1],":", listContents[i][1:len(listContents[i])-2])
得到的答案如下所示:
我們打印一下匹配到的兩個結果看一下,修改代碼如下:
#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是規范的,所以是一一對應(對于錯誤輸入,暫時不考慮) for i in range(len(listNames)): #輸出的時候利用切片丟棄多余的符號,如:<>/ print(listNames[i][1:len(listNames[i])-1],":", listContents[i][1:len(listContents[i])-2])
顯示結果如下:
從第一個箭頭顯示可以看出,這個處理是對的,那么看第二個箭頭,這個匹配的結果顯然是不對的了,那么是什么原因呢?
這是因為在正則中,‘*'、‘+'、‘?'這些是貪婪匹配,如用 a*,操作結果是盡可能多地匹配模式。所以當你試著匹配一對對稱的定界符,如 HTML 標志中的尖括號。匹配單個 HTML 標志的模式不能正常工作,因為 .* 的本質是“貪婪”的 。在這種情況下,解決方案是使用不貪婪的限定符 *?、+?、?? 或 {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是規范的,所以是一一對應(對于錯誤輸入,暫時不考慮) for i in range(len(listNames)): #輸出的時候利用切片丟棄多余的符號,如:<>/ print(listNames[i][1:len(listNames[i])-1],":", listContents[i][1:len(listContents[i])-2])
最后,用分組對代碼的正則進行優化一下,如下:
#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是規范的,所以是一一對應(對于錯誤輸入,暫時不考慮) for i in range(len(listNames)): print(listNames[i],":", listContents[i])
感謝各位的閱讀!關于“python正則中最短匹配的示例分析”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。