python學習筆記之正則表示式1
正則表示式
正則表示式即RE,我們可以使用正則表示式來匹配字串集,其實正則表示式是一個小型的程式語言。它可以方便我們對於文字任務的操作。
對於python來說,re模組就是正則式操作模組。
元字元:元字元是特殊的字元,普通的字元在正則表示式中都可以用來匹配自己,如正則表示式‘zhang’可以匹配字串‘zhang’,但是元字元有他特殊的含義。元字元有: . ^ $ * ? [] {}()
常用的就是這7個。依次介紹:
1:中括號 [] :作用是指定一個字元類,即用來存放需要匹配的字串集合,該集合成為一個字元類,例如: [PTU] 含義是:匹配字元P、T或者U,含有一種形式:[a-c] 含義是:匹配字元a、b或者c
特別的,元字元在中括號中就喪失了它的特殊意義,變成了普通字元,也就是可以匹配元字元本身了。例如:[ZD$] 含義是:匹配字元Z、D或者$。
2:^ 是脫字元號,例子:[^1] 匹配除了1以外的任何字元。
3: 反斜槓\:很重要,正則表示式中用的最多。反斜槓\ 加元字元可以將元字元轉成普通字元。喪失其元字元的特殊含義。例如正則表示式:‘ \*’含義是匹配字元*。‘\?’含義是匹配字元問號?
4:反斜槓加上一些普通字元可以表示一些特殊功能。列舉:\d 匹配任何十進位制數字字元 相當於 [0-9]
\D 匹配任何非十進位制數字字元
\s 匹配任何空白字元(空格 回車 製表鍵)
\w 匹配任何單詞字元
這些都可以加入到字元類(中括號)中。
5: . 點:它匹配了換行符以外的任何字元 例如:正則式‘Z.U’匹配ZAU 或者ZBU等字串
以上都是匹配字元,
我們還可以一下元字元來匹配字串:
6: * :匹配前一個字元的0次或者多次
7: + :匹配前一個字元1次或者多次
8: ?:匹配前一個字元0次或者1次
9: 花括號{} 例如{m,n} 表示前一個字元必須要匹配m到n次之間。
當然花括號可以代替前面的6,7,8元字元。不在贅述
在python中使用正則表示式
Python中的re模組,就是正則式模組。一般情況下,我們將正則式字串編譯成模式物件,然後對其進行操作。
編譯方法如下: p=re.compile(r‘zhangruilin’) 稍後會解釋為什麼字串前面帶一個r字元。 其中正則正則表示式作為一個字元傳入函式,然後函式返回一個模式物件。
現在解釋下正則表示式字串前面為什麼會有一個字元r,在正則表示式中,我們都知道反斜槓會讓一些普通字元具有特殊含義,例如\d,我們想要匹配反斜槓,就要在反斜槓前面加入一個反斜槓,即\\。
同樣,在python,反斜槓同樣有特殊含義(即\\ 表示\),例如我們要匹配’\zhangruilin’ 則正則式表示為 ‘\\zhangruilin’ 進而,在python中 最終要寫成’\\\\zhangruilin’ 才可以。大家若是不理解,就直接記住,在匹配字串時候,正則式字串前面加上字元r即可。所以要匹配字串’\zhangruilin’ 正則式字串表示為:‘\\zhangruilin‘這樣就更加簡單。
10: 匹配函式:將正則表示式字串編譯後,成為模式物件,對於模式物件,我們有很多操作函式。
Findall match search 接下來一一介紹。
Findall()函式:遍歷字串,找到匹配成功的所有位置,然後以列表的形式返回
Match()函式:判斷正則表示式是否從開始出匹配,若是,返回一個匹配物件,若不是返回none
Search() 遍歷字串找到匹配的第一個位置(因為一個字串中可以有多個匹配成功的子字串)
同時對於match ()和search()返回的匹配物件,我們有如下操作:
Group() 返回匹配的字串(預設是貪婪的,關於正則表示式預設是貪婪匹配的)
Start() 返回匹配的字串在元字串中的起始位置
Span()返回匹配的字串在元字串中的範圍
End() 返回匹配的字串在元字串中的結束位置
以上的所有操作如下圖:
>>>import re #匯入模組
>>>ZZBDS=re.compile(r'\.zhang*[abc]*') #編譯正則表示式,生成模式物件
>>>str1='.zhan' #匹配字串
>>>a=ZZBDS.match(str1) #使用match函式 :正則式物件 ZZBDS 從頭匹配str1,則返回匹配物件
>>>a.span() #返回匹配範圍
(0, 5)
>>>a.start() #返回匹配開始位置
0
>>>a.end() #返回匹配結束位置的下一個 注意:真正結束位置是4
5
>>>str2='zhang'
>>> b=ZZBDS.match(str2) #匹配失敗,ZZBDS表示式第一個匹配要求為 . 匹配失敗
>>>type(b) #匹配失敗,返回空
<class'NoneType'>
>>>str3='.zhanggggaaaa'
>>>c=ZZBDS.match(str3)
>>>c.span()
(0, 13)
>>>c.start()
0
>>>c.end()
13
>>>str4='.zhanabc'
>>>d=ZZBDS.match(str4)
>>>type(d)
<class'_sre.SRE_Match'>
>>>d.span()
(0, 8)
>>>d.end()
8
>>>d.start()
0
>>>str5='zzu.zhangggggdddda'
>>>e=ZZBDS.search(str5) #遍歷字串,找到匹配的第一個位置
>>>e.span()
(3, 13)
import re
ZZBDS=re.compile(r'\.zhang*[abc]*')
str1='.zhan'
a=ZZBDS.match(str1)
a.span()
a.start()
a.end()
str2='zhang'
b=ZZBDS.match(str2)
b
str3='.zhanggggaaaa'
c=ZZBDS.match(str3)
c.span()
c.start()
c.end()
str4='.zhanabc'
d=ZZBDS.match(str4)
str5='zzu.zhangggggdddda'
e=ZZBDS.search(str5)
str6='zzu.zhangggggdddd'
f=ZZBDS.search(str6)