前言 正則表達(dá)式就是從字符串中發(fā)現(xiàn)規(guī)律,并通過“抽象”的符號表達(dá)出來。打個比方,對于2,5,10,17,26,37這樣的數(shù)字序列,如何計算第7個值,肯定要先找該序列的規(guī)律,然后用n2+1這個表達(dá)式來描述其規(guī)律,進而得到第7個值為50。對于需要匹配的字符串來說,同樣把發(fā)現(xiàn)規(guī)律作為第一步,本文主要使用正則表達(dá)式完成字符串的查詢匹配、替換匹配和分割匹配。 常用的正則符號 在進入字符串的匹配之前,先來了解一下都有哪些常用的正則符號,見下表所示: 如果讀者能夠比較熟練地掌握上表中的內(nèi)容,相信在字符串處理過程中將會游刃有余。如前文所說,本節(jié)將基于正則表達(dá)式完成字符串的查詢、替換和分割操作,這些操作都需要導(dǎo)入re模塊,并使用如下介紹的幾個函數(shù)。 字符串的匹配查詢 re模塊中的findall函數(shù)可以對指定的字符串進行遍歷匹配,獲取字符串中所有匹配的子串,并返回一個列表結(jié)果。該函數(shù)的參數(shù)含義如下: findall(pattern, string, flags=0) pattern:指定需要匹配的正則表達(dá)式。 string:指定待處理的字符串。 flags:指定匹配模式,常用的值可以是re.I、re.M、re.S和re.X。re.I的模式是讓正則表達(dá)式對大小寫不敏感;re.M的模式是讓正則表達(dá)式可以多行匹配;re.S的模式指明正則符號.可以匹配任意字符,包括換行符\n;re.X模式允許正則表達(dá)式可以寫得更加詳細(xì),如多行表示、忽略空白字符、加入注釋等。 字符串的匹配替換 re模塊中的sub函數(shù)的功能是替換,類似于字符串的replace方法,該函數(shù)根據(jù)正則表達(dá)式把滿足匹配的內(nèi)容替換為repl。該函數(shù)的參數(shù)含義如下: sub(pattern, repl, string, count=0, flags=0) pattern:同findall函數(shù)中的pattern。 repl:指定替換成的新值。 string:同findall函數(shù)中的string。 count:用于指定最多替換的次數(shù),默認(rèn)為全部替換。 flags:同findall函數(shù)中的flags。 字符串的匹配分割 re模塊中的split函數(shù)是將字符串按照指定的正則表達(dá)式分隔開,類似于字符串的split方法。該函數(shù)的具體參數(shù)含義如下: split(pattern, string, maxsplit=0, flags=0) pattern:同findall函數(shù)中的pattern。 maxsplit:用于指定最大分割次數(shù),默認(rèn)為全部分割。 string:同findall函數(shù)中的string。 flags:同findall函數(shù)中的flags。 實戰(zhàn)案例 如果上面的函數(shù)和參數(shù)含義都已經(jīng)掌握了,還需要進一步通過案例加強理解,接下來舉例說明上面的三個函數(shù): 如上結(jié)果所示,在第一個例子中通過正則表達(dá)式'tianqi:'(.*?)''實現(xiàn)目標(biāo)數(shù)據(jù)的獲取,如果不使用括號的話,就會產(chǎn)生類似'tianqi:'晴'', 'tianqi:'陰~小雨''這樣的值,所以,加上括號就是為了分組,且僅返回組中的內(nèi)容; 第二個例子并沒有將正則表達(dá)式寫入圓括號,如果寫上圓括號也是返回一樣的結(jié)果,所以findall就是用來返回滿足匹配條件的列表值,如果有括號,就僅返回括號內(nèi)的匹配值; 第三個例子使用替換的方法,將所有的標(biāo)點符號換為空字符,進而實現(xiàn)刪除的效果; 第四個例子是對字符串的分割,如果直接按照正則 '[,。、a-zA-Z0-9]' 分割的話,返回的結(jié)果中包含空字符,如 '2室2廳' 后面就有一個空字符。為了刪除列表中每個元素的首尾空字符,使用了列表表達(dá)式,并且結(jié)合字符串的strip方法完成空字符的壓縮。 |
|