python 正規表示式的貪婪匹配與非貪婪匹配

2021-07-25 09:54:27 字數 3454 閱讀 2220

#

!/usr/local/bin/python

#coding:gbk

import

refopen=open(r'

/tmp/1.txt

','r')

f=fopen.read().strip()

print

"輸出1.txt檔案內容

"print

fprint

"---------------------------------------

"print

"貪婪匹配,re.s('.'匹配字元,包括換行符)

"print re.findall(r"

aaa(.*)ccc

",f,re.s)

print

"---------------------------------------

"print

"非貪婪匹配,re.s('.'匹配字元,包括換行符)

"list=re.findall(r"

aaa(.*?)ccc

",f,re.s)

print

list

print

"---------------------------------------

"print

"re.m匹配多行,這裡把換行符匹配掉

"for i in

list:

print re.findall(r"

(\d+)

",i,re.m)

print

"---------------------------------------

"print

"把匹配出來的字段放到乙個陣列

"array=

for lst in

list:

re_list=re.findall(r"

(\d+)

",lst,re.m)

for i in

re_list:

for i in

array:

print

i輸出的結果:

輸出1.txt檔案內容

aaa123

3145246ccc

aaa32422ccc

---------------------------------------貪婪匹配['

\n123\n314\n5246\nccc\naaa\n32422\n']

---------------------------------------非貪婪匹配,re.s('.

'匹配字元,包括換行符)['

\n123\n314\n5246\n

', '

\n32422\n']

---------------------------------------re.m匹配多行,這裡把換行符匹配掉['

123', '

314', '

5246']

['32422']

---------------------------------------把匹配出來的字段放到乙個陣列

123314

5246

32422

python貪婪和非貪婪

正規表示式通常用於在文字中查詢匹配的字串。python裡數量詞預設是貪婪的(在少數語言裡也可能是預設非貪婪),總是嘗試匹配盡可能多的字元;非貪婪則相反,總是嘗試匹配盡可能少的字元。在"*","?","+",""後面加上?,使貪婪變成非貪婪。

>>> s="

this is a number 234-235-22-423

">>> r=re.match("

.+(\d+-\d+-\d+-\d+)

",s)

>>> r.group(1)

'4-235-22-423

'>>> r=re.match("

.+?(\d+-\d+-\d+-\d+)

",s)

>>> r.group(1)

'234-235-22-423

'>>>

正規表示式模式中使用到通配字,那它在從左到右的順序求值時,會盡量「抓取」滿足匹配最長字串,在我們上面的例子裡面,「.+」會從字元 串的啟始處抓取滿足模式的最長字元,其中包括我們想得到的第乙個整型欄位的中的大部分,「\d+」只需一位字元就可以匹配,所以它匹配了數字「4」,而「.+」則匹配了從字串起始到這個第一位數字4之前的所有字元。

解決方式:非貪婪操作符「?」,這個操作符可以用在"*","+","?"的後面,要求正則匹配的越少越好。

下面這個例子仔細體會下

>>> re.match(r"

aa(\d+)

","aa2343ddd

").group(1)

'2343

'>>> re.match(r"

aa(\d+?)

","aa2343ddd

").group(1)'2

'>>> re.match(r"

aa(\d+)ddd

","aa2343ddd

").group(1)

'2343

'>>> re.match(r"

aa(\d+?)ddd

","aa2343ddd

").group(1)

'2343

'>>>

python的多行匹配

r=re.complile(pattern,re.m)

re.m(re.multiline):多行模式,改變'^'和'$'的行為,即^$標誌將會匹配每一行。

>>> re.findall(r"

^a(\d+)b

","a213b\na2345b\na234b")

['213'

]>>> re.findall(r"

^a(\d+)b

","a213b\na2345b\na234b

",re.m)['

213', '

2345

', '

234'

]>>> re.findall(r"

a(\d+)b

","a213b\na2345b\na234b

") #

如果沒有^標誌,無需re.m

['213

', '

2345

', '

234']

tips:」^」匹配字串的開始,在multiline模式下,也匹配換行符之後。

re.s(re.dotall):點任意匹配模式

元字元「.」在預設模式下,匹配除換行符外的所有字元。在dotall模式下,匹配所有字元,包括換行符。

>>> re.findall(r"

.","\n"

,re.s) ['

\n']

python正規表示式 貪婪 非貪婪

主要就是.與.的區別,是貪婪的,是非貪婪的例子如下 import re line cats are smarter than dogs matchobj1 re.match r are line matchobj2 re.match r are line matchobj1.group 1 matc...

python正規表示式的貪婪匹配

今天在工作過程中用到正規表示式。先說一下我的需求,給這樣乙個句子 今天我和李白 li bai 一起去吃飯,路上碰到了露娜 luna 他倆打起來了。我希望將句子中括號和括號裡的內容刪掉。這個需求可以通過 re.sub 函式來實現。先介紹一下這個函式 原型 rb.sub pattern,repl,str...

正規表示式貪婪模式

貪婪匹配與非貪婪匹配 貪婪匹配 預設情況下,正規表示式使用最長匹配原則 也叫貪婪匹配原則 例如 要將 zoom 中匹配 zo?的部 分替換成 r 替換的的結果是 rom 如果要將 zoom 中匹配 zo 的部分替換成 r 替換後的結果是 rm 非貪婪匹配 當字元?緊隨其他限定符 之後時,匹配模式變成...