本文實例講述了Python正則表達式非貪婪、多行匹配功能。分享給大家供大家參考,具體如下:
一些regular的tips:
1 非貪婪flag
>>> re.findall(r"a(/d+?)","a23b") # 非貪婪模式 ['2']>>> re.findall(r"a(/d+)","a23b") ['23']
注意比較這種情況:
>>> re.findall(r"a(/d+)b","a23b") ['23']>>> re.findall(r"a(/d+?)b","a23b") #如果前后均有限定條件,則非匹配模式失效 ['23']
2 如果你要多行匹配,那么加上re.S和re.M標志
re.S:.將會匹配換行符,默認.逗號不會匹配換行符
>>> re.findall(r"a(/d+)b.+a(/d+)b","a23b/na34b") []>>> re.findall(r"a(/d+)b.+a(/d+)b","a23b/na34b",re.S) [('23','34')]>>>re.M:^$標志將會匹配每一行,默認^只會匹配符合正則的第一行;默認$只會匹配符合正則的末行
>>> re.findall(r"^a(/d+)b","a23b/na34b") ['23']>>> re.findall(r"^a(/d+)b","a23b/na34b",re.M) ['23','34']
但是,如果沒有^標志,
>>> re.findall(r"a(/d+)b","a23b/na34b") ['23','43']
可見,是無需re.M
import ren='''12 drummers drumming,11 pipers piping, 10 lords a-leaping'''p=re.compile('^/d+')p_multi=re.compile('^/d+',re.MULTILINE) #設置 MULTILINE 標志print re.findall(p,n) #['12']print re.findall(p_multi,n) # ['12', '11']import rea = 'a23b'print re.findall('a(/d+?)',a) #['2']print re.findall('a(/d+)',a) #['23']print re.findall(r'a(/d+)b',a) #['23']print re.findall(r'a(/d+?)b',a) # ['23']b='a23b/na34b'''' . 匹配非換行符的任意一個字符'''print re.findall(r'a(/d+)b.+a(/d+)b',b) #[]print re.findall(r'a(/d+)b',b,re.M) # ['23', '34']print re.findall(r'^a(/d+)b',b,re.M) # ['23', '34']print re.findall(r'a(/d+)b',b) #['23','34'] 可以匹配多行print re.findall(r'^a(/d+)b',b) # ['23'] 默認^只會匹配符合正則的第一行print re.findall(r'a(/d+)b$',b) # ['34'] 默認$只會匹配符合正則的末行print re.findall(r'a(/d+)b',b,re.M) #['23', '34']print re.findall(r'a(/d+)b.?',b,re.M) # ['23', '34'] 表達式中的'.'匹配除換行符以外的字符,'?'匹配前一個字符0次或1次print re.findall(r"a(/d+)b", "a23b/na34b") # ['23', '34']
注:Python3.4中,print為函數(shù),需要加括號
希望本文所述對大家Python程序設計有所幫助。
新聞熱點
疑難解答
圖片精選