漳州市網(wǎng)站建設(shè)費(fèi)用電商平臺(tái)怎么加入
正則表達(dá)式是文本匹配模式,也就是按照固定模式匹配文本
一、導(dǎo)入
re模塊是Python環(huán)境的內(nèi)置模塊,所以無需手動(dòng)安裝。直接在文件中導(dǎo)入即可:
import re
二、正則表達(dá)式基礎(chǔ)知識(shí)
. 匹配除換行符以外的任意字符
^ 匹配字符串的開始
$ 匹配字符串的結(jié)尾
* 匹配前面的子表達(dá)式零次或多次
+ 匹配前面的子表達(dá)式一次或多次
? 匹配前面的子表達(dá)式零次或一次
{n} n 是一個(gè)非負(fù)整數(shù)。匹配確定的 n 次
{n,} n 是一個(gè)非負(fù)整數(shù)。至少匹配n 次
{n,m} m 和 n 均為非負(fù)整數(shù),其中n <= m。最少匹配 n 次且最多匹配 m 次
[xyz] 字符集合。匹配所包含的任意一個(gè)字符 [^xyz] 負(fù)值字符集合。匹配未包含的任意字符
\d 匹配一個(gè)數(shù)字字符。等價(jià)于 [0-9]
\D 匹配一個(gè)非數(shù)字字符。等價(jià)于 [^0-9]
\s 匹配任何空白字符,包括空格、制表符、換頁符等等。等價(jià)于 [\f\n\r\t\v]
\S 匹配任何非空白字符。等價(jià)于 [^\f\n\r\t\v]
\w 匹配包括下劃線的任何單詞字符。等價(jià)于'[A-Za-z0-9_]'
\W 匹配任何非單詞字符。等價(jià)于 '[^A-Za-z0-9_]'
例如:
有一個(gè)字符串:python pytttthon
正則表達(dá)式格式為:pyt{4}hon
那么只有"pytttthon"匹配到
如果正則表達(dá)式為:pyt{1,4}hon
那么匹配到的字符串就是python和pytttthon
三、compile
compile()
函數(shù)用于編譯一個(gè)字符串形式的正則表達(dá)式,將其轉(zhuǎn)換為一個(gè)模式對(duì)象(Pattern object)。這個(gè)模式對(duì)象具有匹配(match()
)、搜索(search()
)、查找所有(findall()
)、查找迭代(finditer()
)以及分割(split()
)等方法,用于對(duì)字符串進(jìn)行各種基于正則表達(dá)式的操作。
案例:
import re
pattern=re.compile(r'\d+')
print(pattern)
上述代碼編譯了一個(gè)字符串:‘\d+’為正則表達(dá)式,字符串前的r:代表是原始字符,通常與轉(zhuǎn)義字符聯(lián)用,當(dāng)不加r時(shí)使用轉(zhuǎn)義字符需要使用兩個(gè)\,并返回一個(gè)對(duì)象給pattern。這個(gè)正則表達(dá)式的意義為:找到一個(gè)數(shù)字或多個(gè)數(shù)字的字符串。輸出pattern:
re.compile('\\d+')
四、compile中的方法使用
1、match方法
match方法是用來按順序從頭匹配字符串的。不會(huì)全部匹配,而是找到第一個(gè)符合正則格式的字符串就返回。
案例1:
import re
pattern=re.compile(r'\d+')
m1=pattern.match('one123two457three89')
#因?yàn)閛不是數(shù)字,所以無匹配數(shù)據(jù)
print(m1)
.match中是要匹配格式的字符串,通過上文,我們可知,這個(gè)代碼是要找一個(gè)帶有數(shù)字的字符串,且match是從頭開始匹配,所以在匹配第一個(gè)字符時(shí)發(fā)現(xiàn)不是數(shù)字,所以直接返回。
導(dǎo)致輸出結(jié)果為:None
案例2,按索引查詢:
import re
pattern=re.compile(r'\d+')
m1=pattern.match('one123two457three89',3,6)
print(m1.group())#通過group查看匹配的數(shù)據(jù)
match函數(shù)的參數(shù):(要匹配的字符串,開始索引,結(jié)束索引),開始和結(jié)束索引是前閉后開集合,也就是包括開始索引字符,不包括結(jié)束索引字符。上述代碼實(shí)現(xiàn)了從索引值為3的字符開始,到6結(jié)束,不包括6。.group是查看匹配的數(shù)據(jù)
輸出:123
如果不寫.group輸出:<re.Match object; span=(3, 6), match='123'>
2、search方法
search方法也是搜索匹配字符串,但是與match不同,他是整體的字符串匹配,但只返回第一個(gè)匹配的字符串。
import re
pattern=re.compile(r'\d+')
s1=pattern.search('one123two457three89')
print(s1)
輸出:123。因?yàn)閟earch不是從頭開始嚴(yán)格匹配,所以就會(huì)匹配到123。
3、findall方法
findall也是用來檢索匹配字符串的,而且他會(huì)返回所有符合條件的字符串。并且返回一個(gè)列表。
案例:
import re
pattern=re.compile(r'\d+')
f1=pattern.findall('one123two457three89')
print(f1)
上述代碼是要匹配所有是數(shù)字的字符串,但返回的是一個(gè)列表,所以輸出形式為:
['123', '457', '89']
4、split方法
split方法是分隔字符串的,并且返回一個(gè)列表。這個(gè)方法不歸屬于正則表達(dá)式。
比如我們要按逗號(hào)分隔一個(gè)字符串:
import re
str='a,b,c'
print(str.split(','))
那么我們就可以得到一個(gè)列表:['a', 'b', 'c']
但是如果分隔符是多種的,我們就需要用到正則表達(dá)式了
案例:
import re
str='a,b;;c d'
pattern=re.compile(r'[\s\,\;]+')
print(pattern.split(str))
如果我們要將str中的abcd作為單獨(dú)元素分隔,但他們之間的分隔符不一樣,那么我們就可以將分隔符寫到正則表達(dá)式中。上述代碼將空格逗號(hào)分號(hào)作為分隔符寫入正則表達(dá)式。那么我們將返回的pattern對(duì)象打點(diǎn)調(diào)用split就可以按照pattern格式分隔,split()括號(hào)中填入要分割的字符串。因?yàn)樽址锌赡軆蓚€(gè)或多個(gè)分隔符連著使用,所以后邊加上一個(gè)加號(hào)用來匹配一次或多次。
輸出:['a', 'b', 'c', 'd']
5、sub方法
sub方法是用來替換字符串的,sub方法中有三個(gè)參數(shù):參數(shù)一:替換后的值,參數(shù)二:原值,參數(shù)三:替換幾個(gè)。參數(shù)一既可以傳值也可以穿函數(shù)
案例1:
string='<h1 class="test">1 helloworld</h1>'
pattern=re.compile(r'\d')
print(pattern.sub('2',string))
print(pattern.sub('2',string,1))
上述代碼的第一個(gè)sub方法是要將string字符串中的所有數(shù)字都換成2,第二個(gè)sub方法是將string字符串中的第一個(gè)數(shù)字替換成2。
輸出:<h2 class="test">2 helloworld</h2>
???????????<h2 class="test">1 helloworld</h1>
五、分組
.group方法是將檢索出來的字符串按組取出
在寫正則表達(dá)式時(shí)我們可以將字符串進(jìn)行分組
案例:
string='<h1 class="test">1 helloworld</h1>'
pattern=re.compile(r'<(.\d)\sclass="(.*?)">.*?</(.1)>')#p給組起名字:classname,可以通過名字調(diào)用該組
print(pattern.search(string).group(1))
上述代碼的結(jié)果:test。在寫正則表達(dá)式時(shí)我們可以用括號(hào)對(duì)字符串進(jìn)行分組,數(shù)字代表第幾組,上述代碼是要第一組,也就是class后面括號(hào)內(nèi)的內(nèi)容,在匹配時(shí),匹配到class后邊的組括號(hào)。
我們也可以給組起名,用分組名:
pattern=re.compile(r'<(.\d)\sclass="(?P<classname>.*?)">.*?</(.1)>')
print(pattern.search(string).group('classname'))
上述代碼跟上一個(gè)案例的結(jié)果一樣
sub方法補(bǔ)充(參數(shù)一傳函數(shù)時(shí)):
sub方法中 參數(shù)1函數(shù)名,是對(duì)字符串的替換規(guī)則。參數(shù)2是要操作的字符串,將sub(str)的結(jié)果傳入到第一個(gè)參數(shù)中,返回第一個(gè)參數(shù)的結(jié)果。將匹配的結(jié)果傳入func方法中,對(duì)傳入的數(shù)據(jù)操作,這個(gè)方法的內(nèi)容就是替換規(guī)則。替換后的語句就是func的返回值。
import re
string='<h1 class="test">1 helloworld</h1>'
pattern=re.compile(r'<(.\d)\sclass="(?P<classname>.*?)">.*?</(.1)>')
def func(m):#m是要匹配的格式return "after sub:"+m.group('classname')
#sub方法中傳入函數(shù)
#參數(shù)一:函數(shù)名,參數(shù)二:原字符串
print(pattern.sub(func,string))
上述代碼輸出:after sub:test
六、防止貪婪模式:?
import re
string='<h1 class="test">1 helloworld</h1>'
pattern=re.compile(r'<.\d\sclass=.*>')
print(pattern.search(string).group())
#'?'防止貪婪匹配
pattern=re.compile(r'<.\d\sclass=.*?>')
print(pattern.search(string).group())
上述代碼第一個(gè)輸出語句為string完整字符串,而第二個(gè)輸出語句為:<h1 class="test">。因?yàn)榈谝粋€(gè)是貪婪模式,當(dāng)出現(xiàn)重復(fù)的結(jié)尾字符時(shí),他會(huì)匹配到最后一個(gè)>符號(hào),而加上問號(hào),他會(huì)匹配到離他最近的那個(gè)。