1. 程式人生 > >從零開始的Python學習Episode 15——正則表示式

從零開始的Python學習Episode 15——正則表示式

正則表示式

 

正則表示式(或 RE)是一種小型的、高度專業化的程式語言,(在Python中)它內嵌在Python中,並通過 re 模組實現,所以使用時要匯入re模組。正則表示式模式被編譯成一系列的位元組碼,然後由用 C 編寫的匹配引擎執行。

 

先說幾個元字元  . ^ $ * + ? { }

 

import re

ret = re.findall('t...r', 'hellotomorrow')
print(ret)  # ['tomor']

ret = re.findall('^r.w', 'r1whellotomorr2w
') print(ret) # ['r1w'] ret = re.findall('r.w$', 'r1whellotomorr2w') print(ret) # ['r2w'] ret = re.findall('hello$', 'r1whellotomorr2w') print(ret) # ['awwwn'] ret = re.findall('abc*', 'abcccc') # 貪婪匹配[0,+oo] print(ret) # ['abcccc'] ret = re.findall('abc*', 'ab') # 貪婪匹配[0,+oo] print(ret) # ['ab']
ret = re.findall('abc+', 'abccc') # [1,+oo] print(ret) # ['abccc'] ret = re.findall('abc?', 'abccc') # [0,1] print(ret) # ['abc'] ret = re.findall('abc{1,4}', 'abccc') print(ret) # ['abccc'] 貪婪匹配 ret=re.findall('abc*?','abcccccc') print(ret)#['ab'] 當* + ?的後面再加上?的話就會變成惰性匹配

 

元字元:[ ]

import re
ret = re.findall('a[bc]d','abd')
print(ret)#['abd'],選b或c

ret = re.findall('[a-z]','abd')
print(ret)#['a', 'b', 'd'],選出a到z的元素

ret = re.findall('[.*+]','a.b+c*')
print(ret)#['.', '+', '*'],消除某些元字元的特殊功能

ret = re.findall('[1-9]','adc51ca')
print(ret)#['5', '1'],選出1到9之間的數字

ret = re.findall('[^ab]','jnan21b')
print(ret)#['j', 'n', 'n', '2', '1'],選出除了a,b的元素

ret = re.findall('\dc','123 cad#4')
print(ret)#['1', '2', '3', '4'],選出數字

 

元字元的轉義符

反斜槓後邊跟元字元去除特殊功能,比如\.
反斜槓後邊跟普通字元實現特殊功能,比如\d

\d  匹配任何十進位制數;它相當於類 [0-9]。
\D 匹配任何非數字字元;它相當於類 [^0-9]。
\s  匹配任何空白字元;它相當於類 [ \t\n\r\f\v]。
\S 匹配任何非空白字元;它相當於類 [^ \t\n\r\f\v]。
\w 匹配任何字母數字字元;它相當於類 [a-zA-Z0-9_]。
\W 匹配任何非字母數字字元;它相當於類 [^a-zA-Z0-9_]
\b  匹配一個特殊字元邊界,比如空格 ,&,#等

 

有一種特殊情況:

import re
m = re.findall('\bblow', 'blow')
print(m)#[]
m = re.findall('\\bblow', 'blow')
print(m)#['blow']
m = re.findall(r'\bblow', 'blow')
print(m)#['blow']

這是因為在python直譯器中“\\”才相當於一個“\”,而光寫一個“\”是不能被識別的。

 

元字元( )分組

 

ret = re.search('(?P<id>\d{3})/(?P<name>\w{2,3})', '233/cn')
print(ret.group())#233/cn
print(ret.group('id'))#233

這段程式碼的意思是以‘/’為界限分為名為id(3個數字)和名為name(2個或3個字母)的兩個組,其中(?P<XXX>)是固定的格式,但可以不用這種格式。如果沒有用這種格式則沒有辦法按名字來訪問組中的資料,按需求來選擇是否要用。而search()是掃描整個string查詢匹配,會掃描整個字串並返回第一個成功的匹配。

 

re.compile()

compile()可以編譯正則表示式模式,返回一個物件。可以把常用的正則表示式編譯成正則表示式物件,方便後續呼叫及提高效率。

import re

ret = re.compile('(\d{3})/(\w{2,3})')
print(ret.search('233/cn').group())
#233/cn

 

re.match()

只檢測是不是在string的開始位置匹配,若在開頭檢測不到,則返回空。

ret = re.match('233','2334567')
print(ret)
#<re.Match object; span=(0, 3), match='233'>
#可以通過ret.span()檢視其終止點,通過ret.group()檢視匹配到的內容。

 

re.search()

掃描整個string查詢匹配,會掃描整個字串並返回第一個成功的匹配.

import re

ret = re.compile('(\d{3})/(\w{2,3})')
print(ret.search('233/cn').group())
#233/cn,也可以像match那樣用span和group

 

re.split()

原型是re.split(pattern, string, maxsplit=0)

通過正則表示式將字串分離。如果用括號將正則表示式括起來,那麼匹配的字串也會被列入到list中返回。maxsplit是分離的次數,maxsplit=1分離一次,預設為0,不限制次數。

import re

ret = re.split('s','adsnjfsnja')
print(ret)
#['ad', 'njf', 'nja']