亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

python正則中最短匹配實(shí)現(xiàn)代碼

 更新時(shí)間:2018年01月16日 21:28:24   作者:陌上行走  
這篇文章主要介紹了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)文章

最新評(píng)論