#python貪婪和非貪婪!/usr/local/bin/python
#coding:gbk
import
refopen=open(r'
/tmp/1.txt
','r')
f=fopen.read().strip()
"輸出1.txt檔案內容
fprint
"---------------------------------------
"貪婪匹配,re.s('.'匹配字元,包括換行符)
"print re.findall(r"
aaa(.*)ccc
",f,re.s)
"---------------------------------------
"非貪婪匹配,re.s('.'匹配字元,包括換行符)
"list=re.findall(r"
aaa(.*?)ccc
",f,re.s)
list
"---------------------------------------
"re.m匹配多行,這裡把換行符匹配掉
"for i in
list:
print re.findall(r"
(\d+)
",i,re.m)
"---------------------------------------
"把匹配出來的字段放到乙個陣列
"array=
for lst in
list:
re_list=re.findall(r"
(\d+)
",lst,re.m)
for i in
re_list:
for i in
array:
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裡數量詞預設是貪婪的(在少數語言裡也可能是預設非貪婪),總是嘗試匹配盡可能多的字元;非貪婪則相反,總是嘗試匹配盡可能少的字元。在"*","?","+",""後面加上?,使貪婪變成非貪婪。
>>> s="正規表示式模式中使用到通配字,那它在從左到右的順序求值時,會盡量「抓取」滿足匹配最長字串,在我們上面的例子裡面,「.+」會從字元 串的啟始處抓取滿足模式的最長字元,其中包括我們想得到的第乙個整型欄位的中的大部分,「\d+」只需一位字元就可以匹配,所以它匹配了數字「4」,而「.+」則匹配了從字串起始到這個第一位數字4之前的所有字元。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
'>>>
解決方式:非貪婪操作符「?」,這個操作符可以用在"*","+","?"的後面,要求正則匹配的越少越好。
下面這個例子仔細體會下
>>> re.match(r"python的多行匹配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
'>>>
r=re.complile(pattern,re.m)
re.m(re.multiline):多行模式,改變'^'和'$'的行為,即^$標誌將會匹配每一行。
>>> re.findall(r"tips:」^」匹配字串的開始,在multiline模式下,也匹配換行符之後。^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']
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 非貪婪匹配 當字元?緊隨其他限定符 之後時,匹配模式變成...