正則的part3:主要操作(python)
3.1 生成正則表達式對象(compile)
re.compile(pattern,flag=0)#原生代碼
這個compile方法實際上是生成一個與pattern對應(yīng)的正則表達式對象,以便于在以后的檢索、匹配、分割登操作時重復(fù)生成,flag在這里沒有什么特別的作用,下面我們就不討論了。以下是操作示例
#其中r1的pattern為正則表達式‘1[2-9]{2}',一集即匹配第一個數(shù)字為1,后兩個數(shù)字為2到9的字符串例如‘123'
r2 = re.compile('hello')
print(r1)
#輸出re.compile('1[2-9]{2}')
print(type(r1))
print(r2)
#輸出re.compile('hello')
print(type(r2))
#輸出<class '_sre.SRE_Pattern'>
看起來還是有點難以理解對吧?沒關(guān)系我們把這個正則表達式對象應(yīng)用下去!
3.2 檢索(search)
re.search(pattern,string)
這個方法是在string中檢索是否有與pattern對應(yīng)的子串,如果有則返回一個match'類型的對象,沒有則返回none,現(xiàn)在我們來結(jié)合上面的compile方法進行示例演示,
r3 = re.search(r1,'abc123asd789')
print(r3)#輸出<_sre.SRE_Match object; span=(3, 6), match='123'>
r4 = re.search(r2,'abc123asd789')
print(r4)#輸出None,因為‘a(chǎn)bc123asd789'中并沒有hello
r5 = re.search(r2,'4we78hello23')
print(r5)#輸出<_sre.SRE_Match object; span=(5, 10), match='hello'>
根據(jù)以上的方法演示,我們可以得出,如果string中有pattern匹配的子串,那么search方法將會返回一個match對象,其中會給出string中與pattern匹配的子串的下標,并且給出匹配的具體內(nèi)容。如果沒有,則會返回None值,此類對象也可以用于邏輯判斷,判斷string中是否有pattern匹配的子串等。
3.3 匹配(match)
re.match(pattern,string)
前面我們講到了match對象,與match方法有一點點區(qū)別,match方法是檢查,string中是否存在一個與pattern匹配的前綴,有則返回一個match對象,沒有則返回None,我們采用示例來說明:
r6 = re.match(r1,'abc123asd189')
r7 = re.match(r1,'1239abc178123')
print(r6)#輸出None
print(r7)#輸出<_sre.SRE_Match object; span=(0, 3), match='123'>
可以看出,盡管字符串 ‘a(chǎn)bc123asd189’和‘1239abc178123'中都有與r1匹配的子串,但是只有字符串‘123’是'1239abc178123'的前綴,所以只有r7輸出了一個match對象
3.4分割(split)
re.split(pattern,string,maxsplit
分割方法以pattern作為分割串將string分段,并存入一個list,參數(shù)中的spilit表面最大分割數(shù),當(dāng)maxsplit = 0時,表示處理完整個字符串,以下是示例,其中的r2為以上生成的與‘hello’對應(yīng)的正則表達式:
r8 = re.split(r2,'IhelloLOVEhelloPYTHONhello!',0)
print(r8)#輸出['I', 'LOVE', 'PYTHON', '!']
r9 = re.split(r2,'IhelloLOVEhelloPYTHONhello!',1)
r10 = re.split(r2,'IhelloLOVEhelloPYTHONhello!',2)
print(r9)#輸出['I', 'LOVEhelloPYTHONhello!']
print(r10)#輸出'I', 'LOVE', 'PYTHONhello!']
可以看出,雖然string相同,但采用不同的maxsplit值,輸出 的結(jié)果并不相同,字符串被分成了maxsplit+1個段,存入了list列表。
3.5 找出所有匹配串
re.findall(pattern,string)
此方法是返回一個表,表中給出可以匹配pattern的所有子串,前面已經(jīng)有過關(guān)于手機號的正則示例了,這里才用r1 = re.compile('1[2-9]{2}'來演示findall方法:
r1 = re.compile('1[2-9]{2}')
r2 = re.findall(r1,'1239abc178555wer123')
print(r2)#輸出['123', '178', '123']
print(type(r2))#輸出<class 'list'>
通過示例可以看出,findall方法會直接返回匹配的子串,并且將子串存入一個列表。
而且不管子串是字符串的前綴、后綴還是包含于字符串中,findall方法都可以找到。
聯(lián)系方式
如果有任何意見或者建議,歡迎發(fā)送郵件到我的郵箱:psywency@foxmail.com
比心??