re模塊(正則表達式)


一、什么是正則表達式

正則就是用一些具有特殊含義的符號組合到一起(稱為正則表達式)來描述字符或者字符串的方法。或者說:正則就是用來描述一類事物的規則。(在Python中)它內嵌在Python中,並通過 re 模塊實現。正則表達式模式被編譯成一系列的字節碼,然后由用 C 編寫的匹配引擎執行。

二、正則表達式基礎

字符組 : [字符組]

在同一個位置可能出現的各種字符組成了一個字符組,在正則表達式中用[]表示 字符分為很多類,比如數字、字母、標點等等。

1 [1]                       匹配1
2 [123]        匹配1、2、3
3 [0-9]       匹配任意一個數字
4 [a-z]       匹配任意一個小寫字母
5 [A-Z]       匹配任意一個大寫字母
6 [A-Za-z]      匹配任意一個字母

示例如下:

1 print(re.findall('[1]','Zll5201314'))       #['1', '1']
2 print(re.findall('[123]','Zll5201314'))     #['2', '1', '3', '1']
3 print(re.findall('[0-9]','Zll5201314'))     #['5', '2', '0', '1', '3', '1', '4']
4 print(re.findall('[a-z]','Zll5201314'))     #['l', 'l']
5 print(re.findall('[A-Z]','Zll5201314'))     #['Z']
6 print(re.findall('[a-zA-Z]','Zll5201314'))  #['Z', 'l', 'l']
7 print(re.findall('[A-Za-z0-3]','Zll5201314')) #['Z', 'l', 'l', '2', '0', '1', '3', '1']

元字符:

 1 .    匹配除換行符以外的任意字符
 2 \w    匹配字母或者數字或者下划線
 3 \s     匹配任意空白字符
 4 \d     匹配數字
 5 \n     匹配換行符
 6 \t    匹配制表符tab
 7 \b    匹配一個單詞的結尾
 8 ^    匹配字符串的開始
 9 $    匹配字符串的結尾
10 \W   匹配非字母或下划線或數字
11 \D   匹配非數字
12 \S   匹配非空白符
13 |    匹配|前或者后的內容
14 ()    匹配括號內的表達式,也表示一個組

示例如下:

 1 print(re.findall('.','love_u 520')) #['l', 'o', 'v', 'e', '_', 'u', ' ', '5', '2', '0']
 2 print(re.findall('\w','love_u 520')) #['l', 'o', 'v', 'e', '_', 'u', '5', '2', '0']
 3 print(re.findall('\s','love_u 520')) #[' ']
 4 print(re.findall('\d','love_u 520')) #['5', '2', '0']
 5 print(re.findall('\n','love_u 520')) #[]
 6 print(re.findall('\b','love_u 520')) #[]
 7 print(re.findall('^l','love_u 520')) #['l']
 8 print(re.findall('520$','love_u 520'))#['520']
 9 print(re.findall('\W','love_u 520')) #[' ']
10 print(re.findall('\D','love_u 520')) #['l', 'o', 'v', 'e', '_', 'u', ' ']
11 print(re.findall('\S','love_u 520')) #['l', 'o', 'v', 'e', '_', 'u', '5', '2', '0']
12 print(re.findall('love|u','love_u 520')) #['love', 'u']

量詞:

1 *   重復零次或者多次 
2 +  重復1次或者多次
3 ?  重復零次或者一次
4 {n}  重復n次
5 {n,}  重復n次或者更多次
6 {n,m}  重復n到m次

示例如下:

1 print(re.findall('5*','555 5')) #['555', '', '5', '']
2 print(re.findall('5+','555 5')) #['555', '5']
3 print(re.findall('5?','555 5')) #['5', '5', '5', '', '5', '']
4 print(re.findall('5{2,3}','555 5')) #['555']
5 print(re.findall('5{2}','555 5')) #['55']
6 print(re.findall('5{3}','555 5')) #['555']

三、常見的正則表達式應用

1 手機號(國內):^[1-9][3478]\d{9}
2 電話號(國內):[0-9-()()]{7,18}
3 郵編:\d{6}
4 QQ:[1-9]([0-9]{5,11})
5 身份證號:\d{17}[\d|x]|\d{15}
6 郵箱:\w[-\w.+]*@([A-Za-z0-9][-A-Za-z0-9]+\.)+[A-Za-z]{2,14}
7 網址:^((https|http|ftp|rtsp|mms)?:\/\/)[^\s]+
8 日期:\d{4}(\-|\/|.)\d{1,2}\1\d{1,2}
9 用戶名:[A-Za-z0-9_\-\u4e00-\u9fa5]+

#正則表達式在線測試網址“http://tool.chinaz.com/regex/”

四、python中如何使用正則表達式

findall()方法:

此方法是在整個字符串中匹配指定字符或者字符串,並且將所有滿足條件的結果返回到一個列表中,如下:

1 ret = re.findall('a','abac')
2 print(ret)  #['a', 'a']
3 ret = re.findall('ab','abac') 4 print(ret)  #['ab']

search()方法:

此方法是在整個字符串中查找滿足匹配條件的字符或者字符串,一旦找到一個就不再繼續查找,並返回包含查找值的對象,可以用.group()方法進行查看,如下:

1 ret = re.search('a','abac')
2 print(ret.group())  #a

match()方法:

此方法是用來從開頭位置查找是否滿足匹配條件,如果沒有就會返回None,如果有,則會返回一個包含查找值的對象,可以用group()方法進行查看,如下:

1 ret = re.match('a','abac')
2 print(ret.group())  #a
3 
4 ret = re.match('b','abac')
5 print(ret)  #None

split()方法:

此方法用來對一個字符串進行切分,如下:

1 ret = re.split('[ab]', 'abcd')  # 先按'a'分割得到''和'bcd',在對''和'bcd'分別按'b'分割
2 print(ret)  # ['', '', 'cd']

sub()以及subn()方法:

1 ret = re.sub('\d', '*', 'a1b2c3')#將數字替換成'*',默認替換所有的數字
2 print(ret) #a*b*c*
3 
4 ret = re.sub('\d', '*', 'a1b2c3', 1)#將數字替換成'*',參數1表示只替換1個
5 print(ret) #a*b2c3
6 
7 ret = re.subn('\d', '*', 'a1b2c3')#將數字替換成'*',返回一個元祖(替換后的字符串,替換的次數)
8 print(ret) #('a*b*c*', 3)

compile()方法:

此方法是先把正則表達式編譯好,以方便多次使用,如下:

1 obj = re.compile('\d{3}')  #將正則表達式編譯成為一個 正則表達式對象,規則要匹配的是3個數字
2 ret = obj.search('abc123eeee') #正則表達式對象調用search,參數為待匹配的字符串
3 print(ret.group())  #結果 : 123
finditer()方法:
此方法與findall類似,只不過返回的不是一個列表,而是一個生產器,可以用next(iter).group()來查看里面的值,如下:
1 ret = re.finditer('\d', 'ds3sy4784a')   #finditer返回一個存放匹配結果的迭代器
2 print(ret)  # <callable_iterator object at 0x10195f940>
3 print(next(ret).group())  #查看第一個結果
4 print(next(ret).group())  #查看第二個結果
5 print([i.group() for i in ret])  #查看剩余的左右結果

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM