1、re模塊與正則表達式python
今天咱們要整理python裏的re模塊和正則表達式,正則表達式不只在python領域,在整個編程屆都佔有舉足輕重的地位。git
在沒有正式介紹re模塊以前咱們須要先了解一下什麼是正則表達式,它又與re模塊有什麼聯繫呢?正則表達式
簡單介紹一下正則表達式並非Python的一部分。正則表達式是用於處理字符串的強大工具,擁有本身獨特的語法以及一個獨立的處理引擎,效率上可能不如str自帶的方法,但功能十分強大。得益於這一點,在提供了正則表達式的語言裏,正則表達式的語法都是同樣的,區別只在於不一樣的編程語言實現支持的語法數量不一樣;但不用擔憂,不被支持的語法一般是不經常使用的部分。若是已經在其餘語言裏使用過正則表達式,只須要簡單看一看就能夠上手了。編程
正則表達式的用法 編程語言
元字符
\w 匹配數字字母下滑線 word關鍵字 [a-zA-Z0-9_]
\d 匹配全部的數字 digit [0-9]
\s 匹配全部的空白符 回車/換行符 製表符 空格 space [\n\t ]
匹配換行符 回車 \n
匹配製表符 tab \t
匹配空格
\W \D \S 和\w \d \s取反
[\s\S] [\d\D] [\w\W]是三組全集 意思是匹配全部字符
\b 表示單詞的邊界
和轉義字母相關的 元字符
\w \d \s(\n\t) \b \W \D \S
^ 與$
^ 匹配一個字符串的開始
$ 匹配一個字符串的結束
. 表示匹配 除換行符以外的全部字符
[] 只要出如今中括號內的內容均可以被匹配
[^] 只要不出如今中括號中的內容均可以被匹配
有一些有特殊意義的元字符進入字符組中會回覆它原本的意義 : . | [ ] ( )
a|b 或 符合a規則的或者b規則的均可以被匹配
若是a規則是b規則的一部分,且a規則比b規則要苛刻/長,就把a規則寫在前面
將更復雜的\更長的規則寫在最前面
() 分組 表示給幾個字符加上量詞約束的需求的時候,就給這些量詞分在一個組
量詞
{n}表示 這個量詞以前的字符出現n次
{n,} 表示這個量詞以前的字符至少出現n次
{n,m} 表示這個量詞以前的字符出現n-m次
? 表示匹配量詞以前的字符出現 0次 或者 1次 表示無關緊要
+ 表示匹配量詞以前的字符出現 1次 或者 屢次
* 表示匹配量詞以前的字符出現 0次 或者 屢次
2、re模塊的使用工具
首先咱們在使用模塊的時候先要導入模塊,這時必不可少的步驟。spa
1.findall 匹配列表中的每個元素code
1 import re 2 s="q6we798qw76sa45f" 3 ret=re.findall("\d",s) 4 print(ret) 5 #運行結果['6', '7', '9', '8', '7', '6', '4', '5']
2.search 只會匹配到第一個符合的表達式(從左到右的順序),獲得的不是直接的結果,須要用group()方法來查看。這裏須要注意當沒有匹配到符合blog
的表達式,直接打印會顯示None,而經過group()方法來查看會報錯內存
1 import re 2 s="as4d98qw7e" 3 ret=re.search("\d",s) 4 print(ret) #運行結果:<_sre.SRE_Match object; span=(2, 3), match='4'> 5 print(ret.group()) #運行結果: 4
findall 與 search 他們的用途都是用來查找,兩者的區別在於findall 能夠匹配所有結果,而search 只能匹配第一個結果。
3.match 大致上與 search 用法相同,而不一樣點則是match默認在表達式前有 "^" 開頭符號
import re s = "123python456" re1 = re.search("\d+$",s) re2 = re.match("\d+$",s) print(re1.group()) #運行結果 : 456 print(re2.group()) #報錯 由於 match 在正則表達式前默認存在一個^,因此字符串s不是以數字開頭數字結尾。
4.split 切割.
1 import re 2 s = "123python456" 3 ret = re.split("\d$",s) 4 print(ret) #運行結果:['123python45', '']
5.sub 與 subn 替換
import re s= "123python456" re1 = re.sub("\d","H",s) print(re1) #運行結果 :HHHpythonHHH re2 = re.subn("\d","H",s) print(re2) #運行結果 :('HHHpythonHHH', 6) subn會返回一個元組,元組中的第二個元素是替換的次數
6.compile 編譯
compile的做用是將正則表達式編譯爲字節碼,當屢次使用時不會屢次便宜,它的特色就是節省時間
1 import re 2 s = "laixue1python2HAPPY" 3 obj1= re.compile("\d") 4 re1 = obj1.findall(s) 5 print(re1) #運行結果 : ['1', '2'] 6 7 obj2 = re.compile("[a-z]+") 8 print(obj2.search(s).group()) #運行結果: laixue
7.finditer 返回一個存放匹配結果的迭代器,能夠經過group()方法來查看結果,它的特色就是減小空間內存
1 import re 2 3 s = "13245python" 4 ret = re.finditer("[a-z]",s) 5 print(ret) # 運行結果 :<callable_iterator object at 0x000001BADC72EAC8> 已經能夠看出是迭代器了 6 7 if ret.__iter__(): 8 print(True) 9 else: 10 print(False) 11 # 判斷返回是否爲迭代器 運行結果爲True 12 13 print([i.group() for i in ret ]) #運行結果 : ['p', 'y', 't', 'h', 'o', 'n'] 因此finditer 能夠用groud()方法來查看結果
分組 ( )在re模塊中的使用
分組 ( ) 在正則表達式中表示分組將多個表達式統一管理後接量詞來用,而在python的re模塊中 " ( ) "有着不同的用法
1.分組 ( ) 表示優先級
在search中使用
1 import re 2 s = "132python456" 3 ret = re.search("\d+([a-z]+)\d+",s) 4 print(ret.group()) #運行結果 : 132python456 5 print(ret.group(1)) #運行結果 ; python 6 # 當咱們在表達式中添加分組表示優先級時,經過在group() 方法中添加參數能夠優先得到結果
在findall中使用
1 import re 2 s = "123python456" 3 # ret = re.findall("\d+([a-z]+)\d+",s) 4 # print(ret) # 運行結果 : ['python'] 5 # 當 ( ) 在findall中使用時,而沒法使用group()方法查看結果,這時默認匹配出( ) 內的結果 6 ret = re.findall("(\d+)([a-z]+)\d+",s) 7 print(ret) # 運行結果 : [('123', 'python')] 8 # 當 多個( )同時使用時,會將結果以元組的形式添加到列表中
在split中使用
1 import re 2 s = "132python456" 3 ret = re.split("^\d+([a-z]+)",s) 4 print(ret) #運行結果 : ['', 'python', '456'] 5 # 在split中使用時() 內的表達式被切割後會留下來。
2.取消 分組( ) 優先級 " ?:"
import re s = "123python456" ret = re.findall("(\d+)(?:[a-z]+)(\d+)",s) print(ret) #運行結果 : [('123', '456')] # 當在( ) 內開頭加入" ?: "字符時 , 表示取消優先級
3.分組( ) 的命名 " ?P< >"
1 import re 2 s = "123python123" 3 ret = re.search("(?P<a>\d+)([a-z]+)(?P=a)",s) 4 print(ret.group(0)) # 運行結果 : 123python123