91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

python正則中最短匹配的示例分析

發布時間:2021-08-03 11:04:47 來源:億速云 閱讀:140 作者:小新 欄目:開發技術

這篇文章給大家分享的是有關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])

得到的答案如下所示:

python正則中最短匹配的示例分析

我們打印一下匹配到的兩個結果看一下,修改代碼如下:

#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])

顯示結果如下:

python正則中最短匹配的示例分析

從第一個箭頭顯示可以看出,這個處理是對的,那么看第二個箭頭,這個匹配的結果顯然是不對的了,那么是什么原因呢?
這是因為在正則中,‘*'、‘+'、‘?'這些是貪婪匹配,如用 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正則中最短匹配的示例分析”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

凤山市| 杨浦区| 阳谷县| 乐东| 同仁县| 新河县| 玛纳斯县| 扎囊县| 龙门县| 余江县| 游戏| 鄂州市| 商都县| 湘潭市| 乌拉特后旗| 萨嘎县| 怀柔区| 万载县| 北碚区| 华亭县| 隆化县| 绥滨县| 龙江县| 上高县| 泗洪县| 菏泽市| 海阳市| 安福县| 临安市| 霸州市| 镇安县| 阿坝县| 肥城市| 绍兴市| 吴忠市| 玉溪市| 舞钢市| 临猗县| 岐山县| 洮南市| 定南县|