關(guān)于Python正則表達(dá)式模塊之re模塊
前言:
re模塊(正則表達(dá))是Python中的重要組成部分,這里涉及到字符串的匹配,轉(zhuǎn)換,自定義格式化……等等,尤其是對(duì)于后面要學(xué)的Python爬蟲是經(jīng)常用到的。這個(gè)模塊是Python自帶的,不需要pip下載,導(dǎo)入使用就行了。
之前我們學(xué)過了r原始字符串標(biāo)識(shí)符,比如:r'123\n' 輸出結(jié)果就是123\n,是表示輸出原始字符串,里面的轉(zhuǎn)義符就當(dāng)做普通的一個(gè)字符直接輸出就行了,這個(gè)也是一種正則表達(dá)方式。
print(r'hello\n123\t') #輸出結(jié)果:hello\n123\t
導(dǎo)入模塊
import re
1.re.match() 函數(shù)
語法格式:re.match(pat,string,flag=0)
用法:re.match('正則表達(dá)式’,'要匹配的字符串',flag= )
參數(shù)說明:
pat:是表示參與匹配的正則表達(dá)式
string:是表示要匹配的字符串
flag:是標(biāo)志符,用于控制正則表達(dá)式的匹配方式(設(shè)置條件之類的)
函數(shù)說明:
這個(gè)函數(shù)是從開頭第一個(gè)字符開始匹配的,如果匹配成功的話就返回一個(gè)匹配對(duì)象,如果失敗就返回none。如果我們想要獲取到返回的對(duì)象就用group(num)函數(shù)來獲取,這個(gè)函數(shù)獲取的結(jié)果就是匹配成功的字符串,如果num為0的話,其實(shí)等效于group(),如果num為1的話就返回正則表達(dá)式第一個(gè)括號(hào)匹配成功的字符串,如果num為2的話就返回正則表達(dá)式第二個(gè)括號(hào)匹配成功的字符串
(1)匹配單個(gè)字符
字符 | 功能 | 位置 |
. | 匹配任意一個(gè)字符(除了\n) | |
[ ] | 匹配[ ]中列舉的字符(可以是一個(gè)范圍) | |
\d | 匹配數(shù)字,0~9 | 可以寫在[ ]中 |
\D | 匹配非數(shù)字,除了數(shù)字以外都可以匹配成功 | 可以寫在[ ]中 |
\s | 匹配空白符,空格 ,Tab | 可以寫在[ ]中 |
\S | 匹配非空白符 | 可以寫在[ ]中 |
\w | 匹配0-9,a-z,A-Z,中文等等除了特殊符號(hào)以外的范圍 內(nèi)的字符 | 可以寫在[ ]中 |
\W | 匹配非單詞子串,除了\w范圍 以內(nèi)的都可以匹配 | 可以寫在[ ]中 |
示例
import re string='hello word!' pat=re.match('.',string) print(pat) print(pat.group()) #輸出結(jié)果:<re.Match object; span=(0, 1), match='h'> # h
其中第一個(gè)輸出的結(jié)果就是返回的對(duì)象,span=(0,1)是表示匹配范圍為字符串的第0位(區(qū)間是左閉右開),匹配成功的字符串match='h'
如果用group()去獲取對(duì)象字符串就直接輸出 h
示例1:
import re #單個(gè)匹配示例 #1.'.'號(hào)匹配 a='123hello你好' a1=re.match('..',a)#正則表達(dá)式有兩個(gè)..那么就匹配字符串a(chǎn)前兩個(gè)字符 print(a1,a1.group()) #輸出結(jié)果:<re.Match object; span=(0, 2), match='12'> 12 #2.'.'號(hào)匹配 b='garrymod555' b1=re.match('g..r',b) print(b1,b1.group()) #輸出結(jié)果:<re.Match object; span=(0, 4), match='garr'> garr #3.直接匹配:被匹配的字符串首字符要與正則表達(dá)式相同,大小寫一一對(duì)應(yīng) c='python歐尼醬' c1=re.match('p',c) print(c1,c1.group()) #輸出結(jié)果:<re.Match object; span=(0, 1), match='p'> p #4.利用[],枚舉匹配 d='Haolow' d1=re.match('[hH]',d) #這時(shí)候d 的開頭大小寫都可以匹配成功 print(d1,d1.group()) #輸出結(jié)果:<re.Match object; span=(0, 1), match='H'> H #利用[],枚舉匹配0~9范圍的數(shù)字 num='51997asd' num1=re.match('[0123456789]',num) print(num1,num1.group()) #輸出結(jié)果:<re.Match object; span=(0, 1), match='5'> 5 #5.利用[],范圍匹配 e='ikuncxk' e1=re.match('[a-z]',e) #[]內(nèi)是表示a~z在字符范圍 print(e1,e1.group()) #輸出結(jié)果:<re.Match object; span=(0, 1), match='i'> i #6.利用[],匹配多個(gè)范圍 f='567hhh' f1=re.match('[2-68-9]',f) #這個(gè)是表示匹配2~6和8~9 范圍以內(nèi)的數(shù)字(字母也是同樣的道理) print(f1,f1.group()) #輸出結(jié)果:<re.Match object; span=(0, 1), match='5'> 5 #7.利用\d,匹配數(shù)字(另外一個(gè)是\D,這里就不講了,正則表達(dá)式匹配添加是跟\d完全相反的) g='666985www' g1=re.match('\d',g) # print(g1,g1.group()) #輸出結(jié)果:<re.Match object; span=(0, 1), match='6'> 6 #8.利用\s,匹配空白符(跟上面一樣\S,是\s反過來的,用法一樣,不講) h=' 91呵呵' h1=re.match('\s',h) print(h1,h1.group()) #輸出結(jié)果:<re.Match object; span=(0, 1), match=' '> #9.利用\w,匹配0-9,a-z,A-Z,中文等等除了特色符號(hào)以外的范圍內(nèi)的字符 i='天問1號(hào)' i1=re.match('\w',i) print(i1,i1.group()) #輸出結(jié)果:<re.Match object; span=(0, 4), match='天問1號(hào)'> 天問1號(hào) #10.利用\W,匹配特殊字符(\w范圍以外的字符) k='@qq.com' k1=re.match('\W',k) print(k1,k1.group()) #輸出結(jié)果:<re.Match object; span=(0, 1), match='@'> @
示例2:(匹配失?。?/strong>
import re kun='hellosad' k=re.match('5',kun) print(k) #輸出結(jié)果:None
(2)匹配多個(gè)字符 字符功能/說明位置*
字符 | 功能/說明 | 位置 |
* | 匹配前一個(gè)字符,這個(gè)字符出現(xiàn)0次到無限次(可有可無) | 可以用在字符或者()之后 |
+ | 匹配前一個(gè)字符,這個(gè)字符必須出現(xiàn)一次以上(否則報(bào)錯(cuò))上限為無限 | 可以用在字符或者()之后 |
? | 匹配前一個(gè)字符,這個(gè)字符出現(xiàn)0次到1次 | 可以用在字符或者()之后 |
{m} | 匹配前?個(gè)字符出現(xiàn)m次 | 可以用在字符或者()之后 |
{m,n} | 匹配前?個(gè)字符出現(xiàn)從m到n次,若省略m,則匹配0到n次,若省略n,則匹配m到無限次;若省略m,這匹配m,這匹配0到n次 | 可以用在字符或者()之后 |
示例代碼:
import re # * 匹配多個(gè)字符 p='1112223haowww.com' #示例1 p1=re.match('[\d]*',p) print(p1.group()) #輸出結(jié)果:1112223 #示例2 p2=re.match('1*',p) print(p2.group()) #輸出結(jié)果:111 #示例3 p3=re.match('1t*',p) print(p3.group()) #不會(huì)報(bào)錯(cuò) #輸出結(jié)果:1 # + 匹配多個(gè)字符 q='aaa112python' #示例1 q1=re.match('[a-z]+',q) print(q1.group()) #輸出結(jié)果:aaa #示例2 q2=re.match('ai+',q) #print(q2.group()) #報(bào)錯(cuò) print(q2) #輸出結(jié)果:None # { }綜合使用 #示例1:匹配由大小寫字母以及數(shù)字組成的密碼 ret=re.match('[a-zA-Z0-9]{6}','321uyg88') #如果{}里面的數(shù)字大于8就會(huì)報(bào)錯(cuò),超過范圍了 print(ret.group()) #輸出結(jié)果:321uyg #示例2:匹配8~12為由小寫字母和數(shù)字組成的密碼 res=re.match('[a-z0-9]{8,12}','123520ikun') print(res.group())#輸出結(jié)果123520ikun
(3) 匹配開頭和結(jié)尾
字符 | 功能 |
^ | 匹配字符串的開頭 |
$ | 匹配字符串的結(jié)尾 |
示例:
2.re.search() 函數(shù)
格式:
re.search('正則表達(dá)式','字符串')
說明:這個(gè)函數(shù)是從整個(gè)字符串去進(jìn)行匹配的,跟re.match()不同,re.match()是從開頭去匹配,如果開頭不一樣就返回None,而re.search()是看字符串的全局,直到匹配到滿足正則表達(dá)式才返回匹配對(duì)象,如果整個(gè)字符串都沒有找到匹配對(duì)象才會(huì)返回None
示例:
import re r=re.search('wao','123waohhhq') print(r.group()) #輸出結(jié)果:wao s=re.search('q[0-9]?j','heheqq5jbye') print(s.group()) #輸出結(jié)果:q5j
3.re.findall() 函數(shù)
格式:
re.findall('正則表達(dá)式','字符串')
說明:整個(gè)函數(shù)同樣也是從整個(gè)字符串來匹配,但是這個(gè)函數(shù)是吧整個(gè)字符串所以滿足正則表達(dá)式的子串以列表的形式返回(前面的函數(shù)都是返回一個(gè)對(duì)象,需要用group()函數(shù)來獲取對(duì)象的子串),而這個(gè)函數(shù)是直接返回一個(gè)含有全部子串的列表
示例:
import re ret=re.findall('\d+','123www555abc789') print(ret) #輸出結(jié)果:['123', '555', '789']
4.re.finditer() 函數(shù)
格式:
re.finditer('正則表達(dá)式','字符串')
說明:這個(gè)函數(shù)跟re.findall() 差不多,只是前者是返回一個(gè)迭代器(需要用循環(huán)去依次獲取里面的對(duì)象),而后者是返回一個(gè)列表
示例:
import re ret=re.finditer('\d+','Python999,C++555,Java666') print(ret) #輸出的是迭代器地址 for i in ret: print(i.group(),end=' ') #輸出結(jié)果:<callable_iterator object at 0x000001E35504B5E0> # 999 555 666
5.re.split() 函數(shù)
split()整個(gè)函數(shù)在之前的字符串操作初步講過,是一個(gè)切割函數(shù)Python學(xué)習(xí)------起步7(字符串的連接、刪除、修改、查詢與統(tǒng)計(jì)、類型判斷及字符串字母大小寫轉(zhuǎn)換)_Python歐尼醬的博客-CSDN博客
格式:
re.split(pat,string,times)
參數(shù)說明:
pat:是正則表達(dá)式
string:是字符串
times:是分割次數(shù)
功能作用:在整個(gè)字符串中,根據(jù)匹配成功的子串作為切割點(diǎn),對(duì)字符串進(jìn)行切割,然后返回一個(gè)列表類型
示例:
import re cut=re.split('\d','hello 1 my 2 friend') print(cut) #輸出結(jié)果:['hello ', ' my ', ' friend'] cut_1=re.split(r':| ','Jack say:"I can do this all day"') #r表示后面為原字符串 print(cut_1) #輸出結(jié)果:['Jack', 'say', '"I', 'can', 'do', 'this', 'all', 'day"']
6.re.sub() 函數(shù)
格式:
re.sub(pat,repalc,string,count,flag)
參數(shù):
pat:是表示正則表達(dá)式
replac:是要替換的字符串或者函數(shù)(必寫)
string:是匹配的字符串
count:是替換的最大次數(shù),如果不寫就默認(rèn)全部替換
flag:可選參數(shù),標(biāo)志符,用于控制正則表達(dá)式的匹配條件
功能說明:sub是substitute的縮寫,意思是取代,這個(gè)函數(shù)可以將匹配到的子串進(jìn)行取代替換,然后返回一個(gè)字符串類型
import re kun=re.sub('\d[A-Z]','鶩','hello,4Baww5Kc8P') print(kun) #輸出結(jié)果:hello,鶩aww鶩c鶩 KUN=re.sub('\d[A-Z]','鶩','hello,4Baww5Kc8P',count=2) #這里設(shè)置了count的值為2 print(KUN) #輸出結(jié)果:hello,鶩aww鶩c8P
7.re.subn() 函數(shù)
re.subn(pat,repalc,string,count,flag)
參數(shù):
pat:是表示正則表達(dá)式
replac:是要替換的字符串或者函數(shù)(必寫)
string:是匹配的字符串
count:是替換的最大次數(shù),如果不寫就默認(rèn)全部替換
flag:可選參數(shù),標(biāo)志符,用于控制正則表達(dá)式的匹配條件
說明:這個(gè)函數(shù)的用法跟re.sub() 的用法是一樣的,只是返回值不一樣,這個(gè)函數(shù)的返回值是一個(gè)元組,格式:('返回的字符串','次數(shù)')
import re def rep(temp): temp='GBT' return temp su=re.subn('\d+',rep,'hao,w1q2d3') #不設(shè)置count,此時(shí)就是全部的替換次數(shù) print(su) #輸出結(jié)果:('hao,wGBTqGBTdGBT', 3)
到此這篇關(guān)于關(guān)于Python正則表達(dá)式模塊之re模塊的文章就介紹到這了,更多相關(guān)Python正則表達(dá)式 re模塊內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用python tkinter開發(fā)一個(gè)爬取B站直播彈幕工具的實(shí)現(xiàn)代碼
這篇文章主要介紹了使用python tkinter開發(fā)一個(gè)爬取B站直播彈幕的工具,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-02-02pandas.DataFrame.drop_duplicates 用法介紹
這篇文章主要介紹了pandas.DataFrame.drop_duplicates 用法介紹,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-07-07django mysql數(shù)據(jù)庫及圖片上傳接口詳解
這篇文章主要介紹了django mysql數(shù)據(jù)庫及圖片上傳接口詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-07-07python中dir()與__dict__屬性的區(qū)別淺析
這篇文章主要給大家介紹了關(guān)于python中dir()與__dict__屬性的區(qū)別的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-12-12Python容器使用的5個(gè)技巧和2個(gè)誤區(qū)總結(jié)
在本篇文章里小編給大家整理的是關(guān)于Python容器使用的5個(gè)技巧和2個(gè)誤區(qū)的相關(guān)知識(shí)點(diǎn)內(nèi)容,需要的朋友們學(xué)習(xí)下。2019-09-09