1. 程式人生 > >python學習筆記之正則表示式1

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)