python正則中最短匹配

2021-08-13 23:06:55 字數 2699 閱讀 4201

下面從乙個例子入手:

利用正規表示式解析下面的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.匹配小括號 裡面的內容 這種方式的輸出是列表型別,不包含括號本...