本節(jié)我們來(lái)學(xué)習(xí)Python的內(nèi)置re模塊,re模塊用于實(shí)現(xiàn)正則表達(dá)的操作,它里面提供了很多方法,例如search()、match()、findall()、split()、sub()等,下面我們依次進(jìn)行學(xué)習(xí)。
1. search()方法
search方法在輸入的字符串中查找,返回第一個(gè)匹配的內(nèi)容,在找到之后返回match對(duì)象,未找到返回None。
語(yǔ)法格式如下:
re.search(pattern,string,[flags])
pattern表示需要匹配的模式,即以正則表達(dá)式來(lái)轉(zhuǎn)換string字符串,flags為標(biāo)志位,用于控制匹配方式。
Flags常用參數(shù)如下:
1) A
對(duì)于\w、\b、\d等只進(jìn)行ASCII匹配。
2) I
匹配的時(shí)候不區(qū)分大小寫。
3) S
使用‘.’字符匹配所有字符。
4) X
忽略字符串中為轉(zhuǎn)移的空格及注釋。
我們通過(guò)例題來(lái)了解一下,代碼如下:
import re string = 'this is www.sztianhecheng.cn' pattern = r'dotcpp' print(re.search(pattern,string,re.I))#不區(qū)分大小寫的方式匹配
輸出結(jié)果為:
<re.Match object; span=(12, 18), match='DOTcpp'>
這個(gè)例子中我們以不區(qū)分大小寫的方式在string字符串中搜索‘dotcpp’,輸出的信息為它的位置及搜索信息。
2. match()方法
match方法從字符串的開(kāi)始位置查詢匹配內(nèi)容,如果找到則返回一個(gè)match對(duì)象,未找到返回None。
語(yǔ)法格式如下:
re.match(pattern,string,[flags])
具體參數(shù)同search相同,可以參看上面的內(nèi)容。
如果我們把上面例子中的方法改為match,輸出結(jié)果為None。
import re string = 'this is www.sztianhecheng.cn' pattern = r'dotcpp' print(re.match(pattern,string,re.I))#不區(qū)分大小寫的方式匹配
輸出結(jié)果:
None
我們對(duì)代碼進(jìn)行修改,把正則表達(dá)式修改為字符串開(kāi)始處的內(nèi)容,代碼如下:
import re string = 'this is www.sztianhecheng.cn' pattern = r'Th' print(re.match(pattern,string,re.I))#不區(qū)分大小寫的方式匹配
輸出結(jié)果為:
<re.Match object; span=(0, 2), match='th'>
一定要注意search用法和match用法的區(qū)別,一般推薦大家使用research方法。
3. findall()方法
findall方法會(huì)在整個(gè)字符串中搜索出符合條件的字符串,然后以列表的形式返回。
語(yǔ)法格式如下:
re.findall(pattern,string,[flags])
具體參數(shù)一致。
我們繼續(xù)修改上面的代碼來(lái)進(jìn)行了解,我們把字符串中內(nèi)容更改一下:
import re string = 'this is www.sztianhecheng.cn dotcpp' pattern = r'dotcpp' print(re.findall(pattern,string,re.I))#不區(qū)分大小寫的方式匹配
輸出結(jié)果為:
['DOTcpp', 'dotcpp']
這種方式就匹配到了string字符串中所有符合pattern條件的內(nèi)容,然后存放在一個(gè)列表中,也可以通過(guò)遍歷的方式輸出這些內(nèi)容。
4. split()方法
split()方法又被稱作分割方法,它能夠以正則表達(dá)式的相關(guān)格式分割字符串,并返回列表,它的語(yǔ)法格式如下:
re.split(pattern,string,[maxsplit],[flags])
這里多了一個(gè)maxsplit參數(shù),用于表示最多的拆分次數(shù),其余參數(shù)與上面一致。
我們通過(guò)最簡(jiǎn)單的例子來(lái)看一下:
import restring = 'this is www.sztianhecheng.cn 'pattern = r' 'print(re.split(pattern,string,re.I)) 輸出結(jié)果為: ['this', 'is', 'www.sztianhecheng.cn ']
我們通過(guò)通過(guò)分割把字符串中的信息存放到了一個(gè)列表中,此用法在學(xué)習(xí)中會(huì)經(jīng)常用到。
還可以通過(guò)數(shù)字來(lái)分割字符串,例如:
import re string = 'A123456B789C' pattern = r'\d*' print(re.split(pattern,string,maxsplit=10))
輸出結(jié)果為:
['', 'A', '', 'B', '', 'C', '']
在這個(gè)例子中,從輸出結(jié)果可以看出通過(guò)數(shù)字分割了整個(gè)字符串,如果我們更改了\d*為\d?還會(huì)出現(xiàn)不同的內(nèi)容,具體使用可以多多參考上一節(jié)的內(nèi)容。
5. sub()方法
Sub方法可以替換字符串中的內(nèi)容,語(yǔ)法格式如下:
re.sub(pattern,repl,string,count,[flags])
repl為替換的字符串,count為替換的最大次數(shù),默認(rèn)為0,其余參數(shù)與上面一致。
我們?cè)谏钪薪?jīng)常會(huì)隱藏手機(jī)號(hào)的信息來(lái)保護(hù)隱私,我們通過(guò)sub方法來(lái)進(jìn)行了解一下,代碼如下:
import restring = '號(hào)碼為:18812345678'#假定手機(jī)號(hào)為18812345678pattern = r'\d'print(re.sub(pattern,'x', string))
輸出結(jié)果為:
號(hào)碼為:xxxxxxxxxxx
這樣就把我們輸入的手機(jī)號(hào)內(nèi)容給替換掉了。
6. 總結(jié)
關(guān)于正則表達(dá)式我們就簡(jiǎn)單的介紹到這里,實(shí)際上正則表達(dá)式中的內(nèi)容還有很多,有興趣的可以去參考re模塊去進(jìn)一步了解,上一節(jié)我們匯總的元字符結(jié)合這一節(jié)學(xué)習(xí)的幾種方法,可以從字符串中篩選出各種各樣的信息,大家可以通過(guò)下面習(xí)題進(jìn)行簡(jiǎn)單的練習(xí)。
7. 習(xí)題
1. 匹配一個(gè)0-9之間任意數(shù)字。
2. <div>中國(guó)</div>,用正則匹配出標(biāo)簽里面的內(nèi)容(“中國(guó)”),其中class的類名是不確定的。
3. 字符串a(chǎn) = "not 404 found 編程 99 蘇州 dotcpp",每個(gè)詞中間是空格,用正則過(guò)濾掉英文和數(shù)字,最終輸出"編程 蘇州"。
8. 題解
1. 代碼:
import re string="""13\n122\n95\n669\n132\n072\n093\n4d""" test = re.compile('(?<![0-9])[0-9]{1,3}(?!\w)') t = test.findall(string) print( t )
輸出:
['13', '122', '95', '669', '132', '072', '093']
2. 代碼:
import re string = '<div>中國(guó)</div>' test = re.findall(r'<div class=".*">(.*?)</div>',string)#.*?為提取文本 print(test)
輸出:
['中國(guó)']
3. 代碼:
import re string = 'not 404 found 編程 99 蘇州 dotcpp' list = string.split(' ') test = re.findall('\d+|[a-zA-Z]+',string) for i in test: if i in list: list.remove(i) new = ' '.join(list) print(new)
輸出:
編程 蘇州
C語(yǔ)言網(wǎng)提供由在職研發(fā)工程師或ACM藍(lán)橋杯競(jìng)賽優(yōu)秀選手錄制的視頻教程,并配有習(xí)題和答疑,點(diǎn)擊了解:
一點(diǎn)編程也不會(huì)寫的:零基礎(chǔ)C語(yǔ)言學(xué)練課程
解決困擾你多年的C語(yǔ)言疑難雜癥特性的C語(yǔ)言進(jìn)階課程
從零到寫出一個(gè)爬蟲(chóng)的Python編程課程
只會(huì)語(yǔ)法寫不出代碼?手把手帶你寫100個(gè)編程真題的編程百練課程
信息學(xué)奧賽或C++選手的 必學(xué)C++課程
藍(lán)橋杯ACM、信息學(xué)奧賽的必學(xué)課程:算法競(jìng)賽課入門課程
手把手講解近五年真題的藍(lán)橋杯輔導(dǎo)課程