1. 程式人生 > >正則表示式常用匹配

正則表示式常用匹配

#-*-coding:utf8-*-

#匯入re庫檔案
import re
# from re import findall,search,S



#.的使用舉例
a = 'xy123'
b = re.findall('x...',a)
print b
#輸出 ['xy12']
#解析:...相當於佔位符,可以替代任意字元,換行符則不可以

#*的使用舉例
a = 'xyxyyy123'
b = re.findall('xy*',a)
print b
#輸出 ['xy', 'xyyyy']
#解析:原先以為會輸出['xy','xyyy','xyyyy'],但事實結果如上,從這裡理解為:* 匹配0次,即為'xy',
#無限多次即為'xyyyy',就是一個位置只能匹配一次,而且是往最多處匹配。就像一個胖子一樣,他只能在一處
#咬一口,所以他在條件允許內(規則內),咬了一口最大的,和?剛好相反。

#?的使用舉例
a = 'xyxyyy123'
b = re.findall('xy?',a)
print b
#輸出 ['xy', 'xy']
#解析:原先以為輸出['xy','xy','xyy'],但事實結果如上,這裡理解為:?匹配 0次,就有2處,所以結果是
#['xy', 'xy'],匹配1次結果是['xyy'],合併2者,由於'xy'和'xyy'都是一處選取出來的,所以選擇最短的匹配。

'''上面的內容全部都是隻需要了解即可,需要掌握的只有下面這一種組合方式(.*?)'''

secret_code = 'hadkfalifexxIxxfasdjifja134xxlovexx23345sdfxxyouxx8dfse'

# #.*的使用舉例
b = re.findall('xx.*xx',secret_code)
print b
#輸出 ['xxIxxfasdjifja134xxlovexx23345sdfxxyouxx']
#解析:這是貪心的用法,在規則內,儘可能的選取長度最大的匹配,並且返回字串。

# # #.*?的使用舉例
c = re.findall('xx.*?xx',secret_code)
print c
#輸出 ['xxIxx', 'xxlovexx', 'xxyouxx']
#解析:這是非貪心演算法,在在規則內,儘可能選取長度最小的匹配,返回結果的列表.
#
# #使用括號與不使用括號的差別
# 這裡不舉例子了,括號內的字串就是返回的結果,否則是全部。


#對比findall與search的區別
s2 = 'asdfxxIxx123xxlovexxdfd'
f = re.search('xx(.*?)xx123xx(.*?)xx',s2).group(2)
print f
#輸出 love
#解析:search是找尋第一個符合條件的字串,S2中只有一個字串符合,group(2)表示
#輸出第二個括號的內容

f2 = re.findall('xx(.*?)xx123xx(.*?)xx',s2)
print f2[0][1]
#輸出 love
#解析:findall是匹配所有符合規律的內容,返回包含結果的列表,S2中也只有一個字串符合,所以它建立一個二維陣列
#f2[0]存放['I','love'],則f2[0][1]就是'love'

#sub的使用舉例
s = '123rrrrr123'
output = re.sub('123(.*?)123','123%d123'%789,s)
print output
#輸出 123789123
#解析:將rrrr用789替換了,寫法如上,有點像c的寫法


#匹配數字,'+'的使用
a = 'asdfasf1234567fasd555fas'
b = re.findall('(\d+)',a)
print b
#輸出 ['1234567', '555']
#解析:這裡也是往最大長度選取,和*的不同是,它最少有一次匹配。

#最後說一下python的re.S
f3 = re.findall('xx(.*?)xx123xx(.*?)xx',s2,re.S)
#如上,re.S的作用就是'.'可以匹配換行符'\n',可以回頭去看看'.'的定義。