1. 程式人生 > >十分鐘學習正則表示式|上手python re模組

十分鐘學習正則表示式|上手python re模組

請給我10分鐘,我有把握讓你10分鐘上手正則表示式。

用一句通俗的語言解釋:正則表示式就是記錄文字規則的程式碼。

正則表示式之所以難學,是因為它有大量的符號,每個符號的意義和用法又是不一樣的,但是隻要掌握了用法,正則表示式也可以很友好。

本文中所有的程式碼都在python的re模組下執行。

 

1、常用字元

在常用字元中,除了·,其餘的字元都是由\和字母所組成,可以發現,小寫字母和大寫字母所表達的意義是相反的。所以正則表示式還是有一定的規律可循。

https://mmbiz.qpic.cn/mmbiz_png/JJbONXXaqJyrvRCGVdqkT4q444fz4Z3icqsG0UproZszGSMYgOtWdFP1EXzUNgWk5jG4ywiaCAAbPLo8RUVTD0Rw/640?wx_fmt=png

 

例項:

1)\d是匹配字串中的數字,在用search方法的時候匹配到第一個數字即返回,用findall即可以匹配到所有的數字。

 

# "\d" 
import re
print(p.search('zy3t4r1').group())
3
print(p.findall('zy3t4r1'))
['3', '4', '1']

 

2)\w可以匹配單詞字元,數字和字母:[A-Za-z0-9]。

# "\w" :單詞字元,數字和字母:[A-Za-z0-9]
import re
p=re.compile('\w')
print(p.search('1a2b3c').group())#匹配最先出現的字元
1
print(p.match('1a2b3c').group())
1
print(p.findall('1a2b3c')) #匹配所有符合條件的字元
['1', 'a', '2', 'b', '3', 'c']

 

3)\s和\S表示的意思相反,\s會匹配 \t、\r、\n、空格的字元,\S則匹配的是非空白的字元。

# "\s" 
import re
p=re.compile('\s')
p.search('\rab1 \ncd2 \tef3').group()
p.match('\rab1 \ncd2 \tef3').group()
print(p.findall('\rab1 \ncd2 \tef3'))

['\r', ' ', '\n', ' ', '\t']


 

# "\S"
import re
p=re.compile('\S')
p.search('\rab1 \ncd2 \tef3').group()
print(p.findall('\rab1 \ncd2 \tef3'))

['a', 'b', '1', 'c', 'd', '2', 'e', 'f', '3']

 

2、重複字元

當正則表示式中包含能接受重複的限定符時,通常的行為是(在使整個表示式能得到匹配的前提下)匹配儘可能多的字元。

https://mmbiz.qpic.cn/mmbiz_png/JJbONXXaqJyrvRCGVdqkT4q444fz4Z3icpONVB7QWweh9BvXAvl7o8nWFDqsFzj9vS75CCYtH7KGmHB3aVetzJg/640?wx_fmt=png

 

例項:

1)"?" 重複0次或1次,在使用match,search時,對於不匹配的字元不會返回none,而會出現' '(空值)。

# "?" 
p = re.compile('[abc]?')
print(p.match('abcdefabc').group())
'a'
print(p.search('abcdefabc').group())
'a'
print(p.findall('abcdefabc'))           #0次和1次
['a', 'b', 'c', '', '', '', 'a', 'b', 'c', '']

 

2)"{n}" 匹配字串出現n次

# "{n}"
import re
p = re.compile('[dc]{2}')     #d或則c出現2次
print(p.search('ddattaccstle').group())#匹配第一次出現的字串,d比c先出現
dd
print(p.findall('ddattaccstle'))  #匹配出現的所有字串,列表形式返回
['dd', 'cc']

 

3)"{n,m}"匹配字串出現n到m次

# "{n,m}" 
import re
p= re.compile('[dc]{2,4}')     #d或則c出現2到4次
print(p.match('ddastleccc').group())  #匹配開頭
dd
print(p.search('ddastleccc').group()) #匹配第一次出現的項
dd
print(p.findall('ddastleccc')) #匹配所有項
['dd', 'ccc']

 

3、分組語法

我們已經知道直接在字元後面加上限定符就可以進行單個字元的重複,但如果想要重複多個字元又該怎麼辦?可以通過分組來進行操作。

https://mmbiz.qpic.cn/mmbiz_png/JJbONXXaqJwZTwibEwJPbrd6vF9hJDUwokicj5wG1byiaOMa75Hz637U6EqI7Jz3rAqm9UibNuvYV8YUIazD0D7sdQ/640?wx_fmt=png

 

例項:

分組就是用一對圓括號“()”括起來的正則表示式,匹配出的內容就表示一個分組。

分完組以後,要想獲得某個分組的內容,直接使用group(num)和groups()函式去直接提取就行。

# 利用分組輸出電話號碼 
import re
m=re.search(r'(\d{3})-(\d{3})-(\d{4})','My phone number is 028-888-5566') #每個括號為一個組
print(m.group(1)) #返回第一組的值
028
print(m.group(2))
888
print(m.group(3))
5566
print(m.group())#返回整個匹配的文字
028-888-5566

 

4、邊界匹配

https://mmbiz.qpic.cn/mmbiz_png/JJbONXXaqJyrvRCGVdqkT4q444fz4Z3icPyiciaMvouMEMfQswYWHS1cCg334UibeNibkychndcoZiaUM12icUcqhx8iaQ/640?wx_fmt=png

例項:

1) "$" :匹配字串結尾

# "$" 
import re
p = re.compile('[abc]$')
print(p.findall('adefAbc'))

['c']

 

2) "\A":匹配字串開頭,下面的例子是匹配從a開始的字串,使用findall(),返回的是開頭的兩個a。

# "\A"
import re
p= re.compile('\A[a]+')
p.search('aabbcc').group()
print(p.findall('aabbcc'))
['aa']

 

5、其它字元

正則表示式涉及的字元非常多,在這裡就不再一一進行講解,只要掌握了正則表示式的一般用法,注意符號和用法,非常容易上手。

https://mmbiz.qpic.cn/mmbiz_png/JJbONXXaqJwZTwibEwJPbrd6vF9hJDUwo7Y7Ia31koVwqaGROib2PawIBib1bDI6rrE1Ru5jmDAQzPkqBAAL51Ilw/640?wx_fmt=png

 

https://mmbiz.qpic.cn/mmbiz_gif/JJbONXXaqJwZTwibEwJPbrd6vF9hJDUwoU2YFrmyogFzic8ZmxokVazrTtIzXtXLzD7iclb6a2rnXT3pOZPRNHXKQ/640?wx_fmt=gif

 

你可能看到,在上面的例子當中,有幾個出現很頻繁的函式,compile()、match()、search()......這些是python當中很常見的一些函式。

 

-compile()

建立一個正則表示式物件,compile() 函式將一個字串編譯為位元組程式碼。

格式:re.compile(pattern,flags=0)

pattern: 編譯時用的表示式字串。

flags:編譯標誌位,用於修改正則表示式的匹配方式,如:是否區分大小寫,多行匹配等。

該函式根據包含的正則表示式的字串建立模式物件。

在直接使用字串表示的正則表示式進行search,match和findall操作時,python會將字串轉換為正則表示式物件。而使用compile完成一次轉換之後,在每次使用模式的時候就不用重複轉換。當然,使用re.compile()函式進行轉換後,re.search(pattern,string)的呼叫方式就轉換為 pattern.search(string)的呼叫方式。

import re
a = "Today is sunday"
b = re.compile(r'\w*a\w*')
print(b.findall(a))   #查詢所有包含'a'的單詞
['Today', 'sunday']

 

-group()

獲取匹配的字串,可以在分組時使用,也可以在search(),match()中使用,最後的結果都是為了返回符合條件的字串。在本文中幾乎每處都有用到,就不再舉例說明。

 

-match()

決定RE是否在字串剛開始的位置匹配。//注:這個方法並不是完全匹配。當pattern結束時若string還有剩餘字元,仍然視為成功。想要完全匹配,可以在表示式末尾加上邊界匹配符'$'

格式:re.match(pattern, string, flags=0)

例項:

import re
print(re.match('data','datawww.castle.com').group())
data
print(re.match('data','datawww.castle.com',re.I).group())
data

 

-search()

在字串中查詢物件。

格式:re.search(pattern, string, flags=0)

re.search函式會在字串內查詢模式匹配,只要找到第一個匹配然後返回,如果字串沒有匹配,則返回None。

import re
print(re.search('\d','www.3data4castle.com').group())
3

 

-findall()

查詢此字串中的所有匹配項,而不僅僅是第一個匹項。

格式:re.findall(pattern, string, flags=0)

re.findall遍歷匹配,可以獲取字串中所有匹配的字串,返回一個列表。

import re
p = re.compile(r'\d+')
print(p.findall('1a2b3c4d5f'))
['1', '2', '3', '4', '5']

利用十分鐘你可以上手正則表示式,但不可能掌握它,最重要的事情是練習!練習!再練習!