




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第超詳細講解python正則表達式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貪婪量詞和懶惰量詞
量詞還可以細分為貪婪量詞和懶惰量詞,貪婪量詞會盡可能多地匹配字符,懶惰量詞會盡可能少地匹配字符。大多數計算機語言的正則表達式量詞默認是貪婪的,要想使用懶惰量詞在量詞后面加即可
示例代碼如下:
importre
m=re.search(r'\d{5,8}','87654321')
print(m)
m=re.search(r'\d{5,8}','87654321')
print(m)
輸出結果如下:
re.Matchobject;span=(0,8),match='87654321'
re.Matchobject;span=(0,5),match='87654'
上述代碼使用了貪婪量詞{5,8},輸入字符串87654321是長度8位的數字字符串,盡可能多地匹配字符結果是87654321。代碼使用懶惰量詞{5,8},輸入字符串87654321是長度8位的數字字符串,盡可能少的匹配字符結果是87654。
1.4分組
在此之前學習的量詞只能重復顯示一個字符,如果想讓一個字符串作為整體使用量詞,可將整個字符串放到一對小括號中,這就是分組(也稱子表達式)
1.4.1分組的使用
對正則表達式進行分組不經可以對一個字符串整體使用量詞,還可以在正則表達式中引用已經存在的分組。示例代碼如下:
importre
p=r'(121){2}'
m=re.search(p,'121121abcabc')
print(m)
print(m.group())#返回匹配的字符串
print(m.group(1))#返回第一組內容
p=r'(\d{3,4})-(\d{7,8})'
m=re.search(p,)
print(m)
print(m.group())#返回匹配字符串
print(m.groups())#獲得所有組內容
輸出結果如下:
re.Matchobject;span=(0,6),match='121121'
121121
121
re.Matchobject;span=(0,12),match=
('010','87654321')
上述代碼定義的正則表達式(121)是將121字符串分為一組,(121){2}表示對121重復兩次,即121121。代碼調用match對象的group()方法返回匹配的字符串,group()方法語法如下:
match.group([group1,...])
其中參數group1是組編號,在正則表達式中組編號是從1開始的,所以代碼正則表達式m.group(1)表示返回第一組內容
代碼r'(\d{3,4})-(\d{7,8})'正則表達式可以用來驗證固定電話號碼,在-之前是3-4位的區號,-之后是7-8位的電話號碼。在該正則表達式中有兩個分組。代碼m.groups()方法是返回所有分組,返回值是一個元組
1.4.2分組命名
在Python程序中訪問分組時,除了可以通過組編號進行訪問,還可以通過組名進行訪問,前提是要在正則表達式中為組命名。組命名通過在組開頭添加P分組名實現。
示例代碼如下:
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())#獲得所有組內容
#通過組編號返回組內容
print(m.group(1))
print(m.group(2))
#通過組名返回組內容
print(m.group('area_code'))
print(m.group('phone_code'))
輸出結果如下:
re.Matchobject;span=(0,12),match=
('010','87654321')
010
87654321
010
87654321
上述代碼其實和1.4.1的代碼是一樣的,只是給正則表達式命名了,以后就可以通過組編號或組名字來訪問
1.4.3反向引用分組
除了可以在程序diamante中訪問正則表達式匹配之后的分組內容,還可以再正則表達式內部引用之前的分組。
下面通過示例熟悉以下反向引用分組。假設由于工作需要想解析一段XML代碼,需要找到某一個開始標簽和結束標簽,示例代碼如下:
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)
輸出結果如下:
re.Matchobject;span=(0,10),match='aabc/a'
re.Matchobject;span=(0,10),match='aabc/b'
上述代碼的正則表達式分成了兩組,兩組內容完全一樣。但是測試結果發現他們都是匹配的,但是aabc/b明顯不是有效的XML代碼,因為開始標簽和結束標簽應該是一致的。可見代碼r'([\w]+).*/([\w]+)'并不能保證開始標簽和結束標簽是一致的。為了解決此問題,可以引用反向引用,即讓第二組反向引用第一組。在正則表達式中反向引用語法是\組編號,組編號是從1開始的。示例代碼如下:
importre
p=r'([\w]+).*/\1'#使用了反向引用①
m=re.search(p,'aabc/a')
print(m)#匹配
m=re.search(p,'aabc/b')
print(m)#不匹配
輸出結果如下:
re.Matchobject;span=(0,10),match='aabc/a'
None
上述代碼第①行時定義正則表達式,其中\1是反向引用第一個組,從運行結果可見字符串aabc/a是匹配的,而aabc/b字符串不匹配
1.4.4非捕獲分組
前面介紹的分組稱為捕獲分組。捕獲分組的匹配子表達式結果被暫時保存到內存中,以備表達式或其他程序引用,這個過程稱為"捕獲",捕獲結果可以通過組編號或組名進行引用。但是有時并不想引用子表達式的匹配結果,不想捕獲匹配結果,只是將小括號作為一個整體進行匹配,此時可以使用非捕獲分組,在組開頭使用,可以實現非捕獲分組
示例代碼如下:
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)
輸出結果如下:
['.jpg','.jpg']
['img1.jpg','img2.jpg']
上述代碼實現了從字符串中查找.jpg結尾的文本,其中代碼第①行和第②行的正則表達式區別在于前者是捕獲分組,后者是非捕獲分組。捕獲分組將括號中的內容作為子表達式進行捕獲匹配,將匹配的子表達式(即組的內容)返回,結果是['.jpg','.jpg']。而非捕獲分組將括號中的內容作為普通的正則表達式字符串進行整體匹配,即找到.jpg結尾的文本,所以最后結果是['img1.jpg','img2.jpg']。
1.5re模塊
re是Python內置的正則表達式模塊,前面雖然使用過re模塊一些函數,但還有很多重要函數沒有詳細介紹,這一節將詳細介紹這些函數
1.5.1search()和match()函數
search()和match()函數非常相似,它們的區別如下所示
search():在輸入字符串中查找,返回第一個匹配內容,如果找到一個則match對象,如果沒有找到返回Nonematch():在輸入字符串開始處查找匹配內容,如果找到一個則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())
輸出結果如下:
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()函數可以匹配成功,而match()函數卻匹配失敗。代碼第②行輸入字符串開頭就是email格式的郵箱,所以search()和match()函數都可以匹配成功
search和match()函數如果匹配成功都返回match對象。match對象有一些常用方法,見代碼第③行。其中group()方法返回匹配的子字符串;start()方法返回子字符串的開始索引;end()方法返回子字符串的結束索引;span方法返回子字符串的跨度,它是一個二元素的元組。
1.5.2findall()和finditer()函數
findall()和finditer()函數非常相似,它們的區別如下所示
findall():在輸入字符串中查找所有匹配內容,如果匹配成功,則返回match列表對象,如果匹配失敗則返回None
finditer():在輸入字符串中查找所有匹配內容,如果匹配成功,則返回容納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())
輸出結果如下:
['Java','java']
Java
java
上述代碼第①行的findall()函數返回match列表對象。代碼第②行的finditer()函數返回可迭代對象。代碼第③行通過for循環遍歷可迭代對象
1.5.3字符串分割
字符串分割使用split函數,該函數按照匹配的子字符串進行字符串分割,返回字符串列表對象
re.split(pattern,string,maxsplit=0,flags=0)
其中參數patte
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 理論聯系實際談一談你對高質量發展的理解參考答案二
- T/ZHCA 004-2018化妝品影響皮膚表面酸堿度測試方法
- 中國石化寧夏能源化工有限公司招聘筆試題庫2025
- 安徽六安市裕安區區屬國有企業招聘筆試題庫2025
- 健康管理師職業資格考試試卷及答案2025年
- 2025年消防安全知識考試試題及答案
- 2025年音樂學專業考試試題及答案
- 2025年數字媒體藝術創作能力測試卷及答案
- 2025年視覺藝術與傳播管理職業資格考試試題及答案
- 2025年公共責任與企業形象管理的考試試題及答案
- 浙江省金華市東陽市2025年七年級下學期期末數學試題及答案
- 江西省煙草專賣局(公司)筆試試題2024
- 期末復習題(試題)2024-2025學年六年級下冊數學人教版
- 多彩的非洲文化 - 人教版課件
- 醫院檢驗科實驗室生物安全程序文件SOP
- 閥門系數Cv和KV值計算表格(帶公式)
- 工業硅技術安全操作規程
- 消防工程項目樣板區、樣板間方案
- 導流明渠施工方案(共4頁)
- 小學美術三年級下冊第5課我們班級的標志PPT課件
- 兒童社會工作案例及分析PPT學習教案
評論
0/150
提交評論