×

python正則表達(dá)式由淺入深

分類(lèi):建站推廣 編輯: 瀏覽量:100
2021-07-27 14:37:16
??如果大家在網(wǎng)上搜索Python 正則表達(dá)式,你將會(huì)看到大量的文章會(huì)這樣寫(xiě)代碼,但是在Python里面,在大多數(shù)情況下真的不需要使用re.compile!數(shù)據(jù)分析工作中很多任務(wù)是跟文本處理相關(guān),比如從文本中提取客戶(hù)的信息,從文本中提取時(shí)間等等都是比較常見(jiàn)的操作。 雖然Python處理字符串的方法很多,而且流行的pandas庫(kù)也提供了大量的向量化字符串方法,但是一旦涉及要經(jīng)過(guò)較為復(fù)雜的數(shù)據(jù)匹配才能進(jìn)行的字符操作,這些方法就顯得非常的乏力。下面就由新網(wǎng)小編和大家講一講python正則表達(dá)式。

??幸運(yùn)的是Python提供了re模塊,可以實(shí)現(xiàn)正則表達(dá)式的操作。re模塊主要通過(guò)六大方法來(lái)對(duì)字符串進(jìn)行處理,包括:match()、search()、findall()、split()、sub()。

??這些方法涉及到字符串的匹配與替換等操作,在接下來(lái)的4篇連載文章里,我們不單只會(huì)講解這4種方法,還會(huì)把元字符、行定位符、限定符、字符類(lèi)、排除字符、選擇字符、轉(zhuǎn)義字符、分組等正則表達(dá)式最常用知識(shí)點(diǎn)貫穿起來(lái)。

??接下來(lái)的系列文章將會(huì)為大家初步搭建較為完整的Python正則表達(dá)式知識(shí)體系,如果你已經(jīng)學(xué)習(xí)完P(guān)ython編程基礎(chǔ)和數(shù)據(jù)清洗的課程知識(shí),該系列文章將會(huì)讓你對(duì)使用Python正則表達(dá)式達(dá)到一學(xué)就會(huì),一用就懂的技能熟悉程度,實(shí)現(xiàn)真正的融會(huì)貫通的目的。

??一、re.match方法

??我們首先看re模塊中較為簡(jiǎn)單的match()方法。

??match 的作用是利用 Pattern 實(shí)例,從字符串左側(cè)開(kāi)始匹配,如果匹配到就返回一個(gè) Match 實(shí)例,如果第一個(gè)字符不符合條件,就返回 None。其語(yǔ)法格式如下:

??re.match(pattern,string,[flags])

??· pattern:表示模式字符串,由要匹配的正則表達(dá)式轉(zhuǎn)換而來(lái)。

??· string:表示要匹配的字符串。

??· flags:可選參數(shù),表示標(biāo)志位,這個(gè)參數(shù)我們后續(xù)再講。

??模式字符串是什么意思呢?先看以下例子:

??pattern='企業(yè)名稱(chēng)'

??message='企業(yè)名稱(chēng):CDA數(shù)據(jù)科學(xué)研究院'

??match = re.match(pattern, message)

??match

??Out:

??這時(shí)我們發(fā)現(xiàn),re.match()方法返回了一個(gè)re.match對(duì)象,但這對(duì)象里面的信息什么意思呢?

??在上面的例子中,我們的模式字符串沒(méi)有使用任何其他特殊字符,只是"企業(yè)名稱(chēng)"。

??而字符串message前面幾個(gè)字符串剛好是"企業(yè)名稱(chēng)",因此返回來(lái)的re.match對(duì)象可以解讀出以下信息:

??· "企業(yè)名字"這幾個(gè)字符串能在message中索引區(qū)間span(0,4)中匹配上

??· 匹配結(jié)果就是match='企業(yè)名稱(chēng)'

??另外,re.match對(duì)象還可以通過(guò)調(diào)用.start()方法以及.end()來(lái)獲取匹配值的開(kāi)始和結(jié)束位置:

??match.start()

??match.end()

??也可以通過(guò).span()方法獲得記載匹配字符所處位置索引的元組:

??match.span()

??Out: (0, 4)

??在message中被匹配上的字符串可以通過(guò).group()方法獲得:

??match.group()

??Out:'企業(yè)名稱(chēng)'

??被匹配的字符串可以通過(guò)re.match對(duì)象的string屬性來(lái)調(diào)用:

??match.string

??Out:'企業(yè)名稱(chēng):CDA數(shù)據(jù)科學(xué)研究院'

??二、re.search方法

??如果說(shuō),要匹配字符串并非出現(xiàn)在message的開(kāi)頭,而是中間,match()方法就沒(méi)辦法匹配上了,這時(shí)候可以使用re.search()方法。

??比如我們想要匹配message中的"CDA數(shù)據(jù)科學(xué)院研究院",我們將pattern指向?qū)ο蟾某?企業(yè)名稱(chēng)",調(diào)用re.search()方法即可:

??pattern='CDA數(shù)據(jù)科學(xué)研究院'

??message='企業(yè)名稱(chēng):CDA數(shù)據(jù)科學(xué)研究院'

??search = re.search(pattern, message)

??search

??Out:

??值得注意的是,re.search()方法結(jié)果返回的也是re.match對(duì)象,因此前面提及到的該類(lèi)對(duì)象的方法和屬性同樣可以調(diào)用。

??search.start()

??search.end()

??search.span()

??search.group()

??search.string

??Out:5

??15

??(5, 15)

??'CDA數(shù)據(jù)科學(xué)研究院'

??'企業(yè)名稱(chēng):CDA數(shù)據(jù)科學(xué)研究院'

??三、元字符

??好,我們繼續(xù)思考,如果我們想要將message中"CDA"后面的一個(gè)字符也匹配上,pattern該如何寫(xiě)?

??pattern='CDA.'

??message='企業(yè)名稱(chēng):CDA數(shù)據(jù)科學(xué)研究院\n郵箱:1918560461@qq.com'

??search = re.search(pattern, message)

??search

??Out:

??通過(guò)上面的例子我們會(huì)發(fā)現(xiàn),message中字符串"CDA"后面的"數(shù)"字也匹配上了,這只需要在設(shè)置pattern的時(shí)候,在字符串"CDA"后面多加一個(gè)圓點(diǎn),而這圓點(diǎn)的作用就是可以幫你匹配除了換行符以外的任意字符。

??除此之外,我們還可以把圓點(diǎn)換成"\w",最終效果也是一樣的:

??pattern='CDA\w'

??message='企業(yè)名稱(chēng):CDA數(shù)據(jù)科學(xué)研究院\n郵箱:1918560461@qq.com'

??search = re.search(pattern, message)

??search

??Out:

??"\w"的作用就是可以幫你匹配字符、數(shù)字、下劃線(xiàn)或者是漢字。

??而這些符號(hào)叫做元字符。

??除了圓點(diǎn)和"\w"以外,還有以下元字符:


??這里需要注意的是,由于元字符大多數(shù)都包含特殊字符和反斜杠,因此,為了匹配原生字符串,可以在元字符之前添加r或R,如:

??pattern=r'\bCDA.{5}' # 在元字符之前添加r

??message='企業(yè)名稱(chēng):經(jīng)管之家CDA數(shù)據(jù)科學(xué)研究院 CDA數(shù)據(jù)分析師\n郵箱:1918560461@qq.com'

??search = re.search(pattern, message)

??print(search)

??Out:

??在上面的例子中,我們還需要注意的就是,由于模式字符串中帶有元字符"\b",而"\b"會(huì)匹配分界符(空格,標(biāo)點(diǎn)符號(hào)或換行符)。

??因此messgae中左邊起第一個(gè)"CDA"字符串前面由于沒(méi)有分界符,最終匹配的是第二個(gè)"CDA"字符串。

??那么上面模式字符串中出現(xiàn)的花括號(hào)"{}"是什么意思呢?這就是我們接下來(lái)要講解的限定符。

??四、限定符

??前面學(xué)習(xí)了元字符,我們配合re.match()方法和re.search()方法就可以進(jìn)行非常靈活的字符匹配。

??但是只有元字符還有很多地方無(wú)法解決,比如,我們希望匹配字符串'企業(yè)名稱(chēng):CDA數(shù)據(jù)科學(xué)研究院\n郵箱:1918560461@qq.com'中的郵箱,該怎么辦?

??這個(gè)時(shí)候,我們就可以在模式字符串中添加限定符:

??pattern='郵箱:.{17}'

??message='經(jīng)管之家CDA數(shù)據(jù)科學(xué)研究院\n郵箱:1918560461@qq.com'

??search = re.search(pattern, message)

??print(search)

??Out:

??上面的patrern參數(shù)設(shè)置的原理是:既然是要匹配出message中的郵箱信息,而郵箱信息是在messaage中字符串"郵箱:"的后面,如果郵箱信息的長(zhǎng)度為1,pattern可以寫(xiě)成"郵箱:.".

??但是該郵箱信息長(zhǎng)度為17個(gè)字符,也就是說(shuō),要匹配message中"郵箱:"后面的17個(gè)字符,這時(shí)在上面的pattern后面添加限定符"{17}"就可以匹配17個(gè)字符(不包括換行符)。

??但是如果郵箱信息長(zhǎng)度不是為17,那該怎么辦?由于郵件信息就是在message中字符串"郵箱:"的后面一直到末端,因此我們可以這樣寫(xiě):

??pattern='郵箱:.*'

??message='經(jīng)管之家CDA數(shù)據(jù)科學(xué)研究院\n郵箱:1918560461@qq.com'

??search = re.search(pattern, message)

??print(search)

??Out:

??除了上面提及的"{n}"和"*"以外,還有那些常用的限定符呢?

python正則表達(dá)式

python正則表達(dá)式

??這里需要給大家一個(gè)提醒的是,由于元字符"."是匹配除了換行符以外的任意字符,因此,即使我們的message中,郵箱信息后面如果有換行,上面的方法依然可以匹配出郵箱信息,比如:

??pattern='郵箱:.*'

??message='企業(yè)名稱(chēng):CDA數(shù)據(jù)科學(xué)研究院\n郵箱:1918560461@qq.com\n地址:北京市海淀區(qū)廠(chǎng)洼街3號(hào)2號(hào)樓2-3層\n網(wǎng)址:www.cda.cn'

??search = re.search(pattern, message)

??print(search)

??Out:

??但是,如果上面的message中"地址"兩個(gè)字的前面沒(méi)有換行符"\n"呢?該如何匹配出郵箱信息?

??我們只需要在pattern中星號(hào)的后面加上郵箱地址最后的字符"com"作為匹配的結(jié)束即可:

??pattern='郵箱:.*com'

??message='企業(yè)名稱(chēng):CDA數(shù)據(jù)科學(xué)研究院\n郵箱:1918560461@qq.com地址:北京市海淀區(qū)廠(chǎng)洼街3號(hào)2號(hào)樓2-3層\n網(wǎng)址:www.cda.cn'

??search = re.search(pattern, message)

??print(search)

??Out:

??正則表達(dá)式可以提高復(fù)雜文本分析的效率,本課程介紹了Python正則表達(dá)式基本概念、為什么使用正則表達(dá)式、正則語(yǔ)法、re模塊及相關(guān)方法使用,如何使用正則表達(dá)式處理文件,讓您對(duì)python正則全面了解。小伙伴們要想獲得更多python正則表達(dá)式的內(nèi)容,請(qǐng)關(guān)注新網(wǎng)!

聲明:免責(zé)聲明:本文內(nèi)容由互聯(lián)網(wǎng)用戶(hù)自發(fā)貢獻(xiàn)自行上傳,本網(wǎng)站不擁有所有權(quán),也不承認(rèn)相關(guān)法律責(zé)任。如果您發(fā)現(xiàn)本社區(qū)中有涉嫌抄襲的內(nèi)容,請(qǐng)發(fā)

送郵件至:operations@xinnet.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),本站將立刻刪除涉嫌侵權(quán)內(nèi)容。本站原創(chuàng)內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)

需注明出處:新網(wǎng)idc知識(shí)百科

免費(fèi)咨詢(xún)獲取折扣

Loading