超詳細(xì)講解python正則表達(dá)式_第1頁
超詳細(xì)講解python正則表達(dá)式_第2頁
超詳細(xì)講解python正則表達(dá)式_第3頁
超詳細(xì)講解python正則表達(dá)式_第4頁
超詳細(xì)講解python正則表達(dá)式_第5頁
已閱讀5頁,還剩8頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

第超詳細(xì)講解python正則表達(dá)式re.Matchobject;span=(0,1),match='8'

re.Matchobject;span=(0,0),match=''

re.Matchobject;span=(0,8),match='87654321'

re.Matchobject;span=(0,0),match=''

re.Matchobject;span=(0,8),match='87654321'

None

re.Matchobject;span=(0,8),match='87654321'

None

re.Matchobject;span=(0,8),match='87654321'

None

1.3.2貪婪量詞和懶惰量詞

量詞還可以細(xì)分為貪婪量詞和懶惰量詞,貪婪量詞會盡可能多地匹配字符,懶惰量詞會盡可能少地匹配字符。大多數(shù)計算機語言的正則表達(dá)式量詞默認(rèn)是貪婪的,要想使用懶惰量詞在量詞后面加即可

示例代碼如下:

importre

m=re.search(r'\d{5,8}','87654321')

print(m)

m=re.search(r'\d{5,8}','87654321')

print(m)

輸出結(jié)果如下:

re.Matchobject;span=(0,8),match='87654321'

re.Matchobject;span=(0,5),match='87654'

上述代碼使用了貪婪量詞{5,8},輸入字符串87654321是長度8位的數(shù)字字符串,盡可能多地匹配字符結(jié)果是87654321。代碼使用懶惰量詞{5,8},輸入字符串87654321是長度8位的數(shù)字字符串,盡可能少的匹配字符結(jié)果是87654。

1.4分組

在此之前學(xué)習(xí)的量詞只能重復(fù)顯示一個字符,如果想讓一個字符串作為整體使用量詞,可將整個字符串放到一對小括號中,這就是分組(也稱子表達(dá)式)

1.4.1分組的使用

對正則表達(dá)式進行分組不經(jīng)可以對一個字符串整體使用量詞,還可以在正則表達(dá)式中引用已經(jīng)存在的分組。示例代碼如下:

importre

p=r'(121){2}'

m=re.search(p,'121121abcabc')

print(m)

print(m.group())#返回匹配的字符串

print(m.group(1))#返回第一組內(nèi)容

p=r'(\d{3,4})-(\d{7,8})'

m=re.search(p,)

print(m)

print(m.group())#返回匹配字符串

print(m.groups())#獲得所有組內(nèi)容

輸出結(jié)果如下:

re.Matchobject;span=(0,6),match='121121'

121121

121

re.Matchobject;span=(0,12),match=

('010','87654321')

上述代碼定義的正則表達(dá)式(121)是將121字符串分為一組,(121){2}表示對121重復(fù)兩次,即121121。代碼調(diào)用match對象的group()方法返回匹配的字符串,group()方法語法如下:

match.group([group1,...])

其中參數(shù)group1是組編號,在正則表達(dá)式中組編號是從1開始的,所以代碼正則表達(dá)式m.group(1)表示返回第一組內(nèi)容

代碼r'(\d{3,4})-(\d{7,8})'正則表達(dá)式可以用來驗證固定電話號碼,在-之前是3-4位的區(qū)號,-之后是7-8位的電話號碼。在該正則表達(dá)式中有兩個分組。代碼m.groups()方法是返回所有分組,返回值是一個元組

1.4.2分組命名

在Python程序中訪問分組時,除了可以通過組編號進行訪問,還可以通過組名進行訪問,前提是要在正則表達(dá)式中為組命名。組命名通過在組開頭添加P分組名實現(xiàn)。

示例代碼如下:

importre

p=r'(Parea_code\d{3,4})-(Pphone_code\d{7,8})'

m=re.search(p,)

print(m)

print(m.group())#返回匹配字符串

print(m.groups())#獲得所有組內(nèi)容

#通過組編號返回組內(nèi)容

print(m.group(1))

print(m.group(2))

#通過組名返回組內(nèi)容

print(m.group('area_code'))

print(m.group('phone_code'))

輸出結(jié)果如下:

re.Matchobject;span=(0,12),match=

('010','87654321')

010

87654321

010

87654321

上述代碼其實和1.4.1的代碼是一樣的,只是給正則表達(dá)式命名了,以后就可以通過組編號或組名字來訪問

1.4.3反向引用分組

除了可以在程序diamante中訪問正則表達(dá)式匹配之后的分組內(nèi)容,還可以再正則表達(dá)式內(nèi)部引用之前的分組。

下面通過示例熟悉以下反向引用分組。假設(shè)由于工作需要想解析一段XML代碼,需要找到某一個開始標(biāo)簽和結(jié)束標(biāo)簽,示例代碼如下:

importre

p=r'([\w]+).*/([\w]+)'

m=re.search(p,'aabc/a')

print(m)

p=r'([\w]+).*/([\w]+)'

m=re.search(p,'aabc/b')

print(m)

輸出結(jié)果如下:

re.Matchobject;span=(0,10),match='aabc/a'

re.Matchobject;span=(0,10),match='aabc/b'

上述代碼的正則表達(dá)式分成了兩組,兩組內(nèi)容完全一樣。但是測試結(jié)果發(fā)現(xiàn)他們都是匹配的,但是aabc/b明顯不是有效的XML代碼,因為開始標(biāo)簽和結(jié)束標(biāo)簽應(yīng)該是一致的??梢姶ar'([\w]+).*/([\w]+)'并不能保證開始標(biāo)簽和結(jié)束標(biāo)簽是一致的。為了解決此問題,可以引用反向引用,即讓第二組反向引用第一組。在正則表達(dá)式中反向引用語法是\組編號,組編號是從1開始的。示例代碼如下:

importre

p=r'([\w]+).*/\1'#使用了反向引用①

m=re.search(p,'aabc/a')

print(m)#匹配

m=re.search(p,'aabc/b')

print(m)#不匹配

輸出結(jié)果如下:

re.Matchobject;span=(0,10),match='aabc/a'

None

上述代碼第①行時定義正則表達(dá)式,其中\(zhòng)1是反向引用第一個組,從運行結(jié)果可見字符串a(chǎn)abc/a是匹配的,而aabc/b字符串不匹配

1.4.4非捕獲分組

前面介紹的分組稱為捕獲分組。捕獲分組的匹配子表達(dá)式結(jié)果被暫時保存到內(nèi)存中,以備表達(dá)式或其他程序引用,這個過程稱為"捕獲",捕獲結(jié)果可以通過組編號或組名進行引用。但是有時并不想引用子表達(dá)式的匹配結(jié)果,不想捕獲匹配結(jié)果,只是將小括號作為一個整體進行匹配,此時可以使用非捕獲分組,在組開頭使用,可以實現(xiàn)非捕獲分組

示例代碼如下:

importre

s='img1.jpg,img2.jpg,img3.bmp'

#捕獲分組

p=r'\w+(\.jpg)'

mlist=re.findall(p,s)①

print(mlist)

#非捕獲分組

p=r'\w+(:\.jpg)'

mlist=re.findall(p,s)②

print(mlist)

輸出結(jié)果如下:

['.jpg','.jpg']

['img1.jpg','img2.jpg']

上述代碼實現(xiàn)了從字符串中查找.jpg結(jié)尾的文本,其中代碼第①行和第②行的正則表達(dá)式區(qū)別在于前者是捕獲分組,后者是非捕獲分組。捕獲分組將括號中的內(nèi)容作為子表達(dá)式進行捕獲匹配,將匹配的子表達(dá)式(即組的內(nèi)容)返回,結(jié)果是['.jpg','.jpg']。而非捕獲分組將括號中的內(nèi)容作為普通的正則表達(dá)式字符串進行整體匹配,即找到.jpg結(jié)尾的文本,所以最后結(jié)果是['img1.jpg','img2.jpg']。

1.5re模塊

re是Python內(nèi)置的正則表達(dá)式模塊,前面雖然使用過re模塊一些函數(shù),但還有很多重要函數(shù)沒有詳細(xì)介紹,這一節(jié)將詳細(xì)介紹這些函數(shù)

1.5.1search()和match()函數(shù)

search()和match()函數(shù)非常相似,它們的區(qū)別如下所示

search():在輸入字符串中查找,返回第一個匹配內(nèi)容,如果找到一個則match對象,如果沒有找到返回Nonematch():在輸入字符串開始處查找匹配內(nèi)容,如果找到一個則match對象,如果沒有找到返回None

示例代碼如下:

importre

p=r'\w+@jiakecong\.com'

text="Tony'semailistony_guan111@"①

m=re.search(p,text)

print(m)

m=re.match(p,text)

print(m)

email='tony_guan111@'②

m=re.search(p,email)

print(m)

m=re.match(p,email)

print(m)

#match對象幾個方法

print('match對象幾個方法:')③

print(m.group())

print(m.start())

print(m.end())

print(m.span())

輸出結(jié)果如下:

re.Matchobject;span=(17,43),match='tony_guan111@'

None

re.Matchobject;span=(0,26),match='tony_guan111@'

re.Matchobject;span=(0,26),match='tony_guan111@'

match對象幾個方法:

tony_guan111@

0

26

(0,26)

上述代碼第①行輸入字符串開頭不是email,search()函數(shù)可以匹配成功,而match()函數(shù)卻匹配失敗。代碼第②行輸入字符串開頭就是email格式的郵箱,所以search()和match()函數(shù)都可以匹配成功

search和match()函數(shù)如果匹配成功都返回match對象。match對象有一些常用方法,見代碼第③行。其中g(shù)roup()方法返回匹配的子字符串;start()方法返回子字符串的開始索引;end()方法返回子字符串的結(jié)束索引;span方法返回子字符串的跨度,它是一個二元素的元組。

1.5.2findall()和finditer()函數(shù)

findall()和finditer()函數(shù)非常相似,它們的區(qū)別如下所示

findall():在輸入字符串中查找所有匹配內(nèi)容,如果匹配成功,則返回match列表對象,如果匹配失敗則返回None

finditer():在輸入字符串中查找所有匹配內(nèi)容,如果匹配成功,則返回容納match的可迭代對象,通過迭代對象每次可以返回一個match對象,如果匹配失敗則返回None

示例代碼如下:

importre

p=r'[Jj]ava'

text='IlikeJavaandjava'

match_list=re.findall(p,text)①

print(match_list)

match_iter=re.finditer(p,text)②

forminmatch_iter:③

print(m.group())

輸出結(jié)果如下:

['Java','java']

Java

java

上述代碼第①行的findall()函數(shù)返回match列表對象。代碼第②行的finditer()函數(shù)返回可迭代對象。代碼第③行通過for循環(huán)遍歷可迭代對象

1.5.3字符串分割

字符串分割使用split函數(shù),該函數(shù)按照匹配的子字符串進行字符串分割,返回字符串列表對象

re.split(pattern,string,maxsplit=0,flags=0)

其中參數(shù)patte

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論