下面從乙個例子入手:
利用正規表示式解析下面的xml/html標籤:
wolfgang amadeus mozart
samuel beckett
london
希望自動格式化重寫為:
composer: wolfgang amadeus mozart
author: samuel beckett
city: london
乙個**是這樣的形式:
#coding:utf-8
import re
s="""wolfgangamadeus mozart
samuelbeckett
london"""
pattern1=re.compile("") #匹配<>中任意的字元
pattern2=re.compile(">.+/
print(listnames[i][1:len(listnames[i])-1],":",
listcontents[i][1:len(listcontents[i])-2])
這個**執行後結果是可以的。
下面我們修改下s的格式:
#coding:utf-8
import re
s="wolfgang amadeus mozart
samuel beckett
london"
pattern1=re.compile("") #匹配<>中任意的字元
# 此模式為非貪婪模式,所以s不是多行也可以匹配
pattern2=re.compile(">.+/
print(listnames[i][1:len(listnames[i])-1],":",
listcontents[i][1:len(listcontents[i])-2])
得到的答案如下所示:
我們列印一下匹配到的兩個結果看一下,修改**如下:
#coding:utf-8
import re
s="wolfgang amadeus mozart
samuel beckett
london"
pattern1=re.compile("") #匹配<>中任意的字元
# 此模式為非貪婪模式,所以s不是多行也可以匹配
pattern2=re.compile(">.+/
print(listnames[i][1:len(listnames[i])-1],":",
listcontents[i][1:len(listcontents[i])-2])
顯示結果如下:
從第乙個箭頭顯示可以看出,這個處理是對的,那麼看第二個箭頭,這個匹配的結果顯然是不對的了,那麼是什麼原因呢?
這是因為在正則中,『*』、『+』、『?』這些是貪婪匹配,如用 a*,操作結果是盡可能多地匹配模式。所以當你試著匹配一對對稱的定界符,如 html 標誌中的尖括號。匹配單個 html 標誌的模式不能正常工作,因為 .* 的本質是「貪婪」的 。在這種情況下,解決方案是使用不貪婪的限定符 *?、+?、?? 或 ?,盡可能匹配小的文字。
那麼**可以修改如下:
#coding:utf-8
import re
s="wolfgang amadeus mozart
samuel beckett
london"
pattern1=re.compile("") #匹配<>中任意的字元
# 此模式為非貪婪模式,所以s不是多行也可以匹配
pattern2=re.compile(">.+?/
print(listnames[i][1:len(listnames[i])-1],":",
listcontents[i][1:len(listcontents[i])-2])
最後,用分組對**的正則進行優化一下,如下:
#coding:utf-8
import re
s="wolfgang amadeus mozart
samuel beckett
london"
pattern1=re.compile("") #匹配<>中任意的字元
# 此模式為非貪婪模式,所以s不是多行也可以匹配
pattern2=re.compile("(.+?)") #匹配...中任意的字元,問號必須加,"?"是非貪婪匹配
listnames=pattern1.findall(s) #獲取所有滿足正規表示式pattern1的字串的列表
listcontents=pattern2.findall(s) #獲取所有滿足正規表示式pattern2的字串的列表
#由於xml是規範的,所以是一一對應(對於錯誤輸入,暫時不考慮)
for i in range(len(listnames)):
print(listnames[i],":",
listcontents[i])
正則匹配 Python
1.1 0 1 個字元1.2 放在末尾,兩個對等字元之間 對等字元 所有稱得上是括號的字元 左右對稱 所有非括號字元 自對稱 最小對等字元匹配 比如 匹配下文 最小結果只有順帶地,當有多個匹配結果時,m re.search m.group n 返回第n組括號匹配的字元。只需要一組結果時,用m.gro...
Python正則匹配
使用re模組 首先生成乙個匹配模式pattern,如pattern test 然後使用re.match pattern,str 或者search 匹配呼叫 match跟search的區別 match 函式試圖從字串的起始部分對模式進行匹配。如果匹配成功救返回乙個匹配物件 如果匹配失敗,就返回none...
python正則匹配
1.匹配字串中的乙個百分比數字 import re t yuchen is a very lovely girl.5.568 company ltd.match re.search r d d t print match.group 2.匹配小括號 裡面的內容 這種方式的輸出是列表型別,不包含括號本...