re.match與re.findall區別:python
match是匹配一次 ,findall 是匹配全部正則表達式
match的返回能夠帶groupapp
兩個方法的具體參數:ide
re.match(pattern, string, flags=0)spa
參數:pattern:匹配的正則表達式;string:要匹配的字符串;flags:標誌位,用於控制正則表達式的匹配方式,如:是否區分大小寫,多行匹配等等。設計
用法:匹配以xxx開頭的字符串,匹配成功就返回對象,不然返回Noneorm
findall(string[, pos[, endpos]])對象
參數:string : 待匹配的字符串;pos : 可選參數,指定字符串的起始位置,默認爲 0;endpos : 可選參數,指定字符串的結束位置,默認爲字符串的長度。字符串
用法:在字符串中找到正則表達式所匹配的全部子串,並返回一個列表,若是沒有找到匹配的,則返回空列表。string
舉例:
1.設計一個讀取字符串中的電話號碼和郵件的程序。
程序開頭內容:
import re
txt='''
Alice's phone number is 13300001234,telphone number is 0731-833334444,and her email is alice_love@gmail.com.
Bob's phone number is (086)13300001234,telphone number is (0731)-81112222,and her email is bob.a@gmail.com.
'''
2.設計電話號碼讀取正則表達式,()用來分組,以便re.match能夠返回group
phonenum_regex=re.compile(r''' #r表示傳入原始字符
\(? #有或者沒有括號
(\d{4}) #4個數字做爲區號
\)? #有或者沒有括號
(\s|-|\.)? #分隔符,空格、‘-’或者‘.’,無關緊要
(\d{8}) #8個數字做爲電話號碼
''',re.VERBOSE) #re.VERBOSE增長可讀性,忽略空格和 # 後面的註釋
3.查看re.match和re.findall的區別
re.findall是查出全部的匹配,返回的是列表,列表的值多是元組(有分組的狀況下才會是元組,沒有分組的狀況見下面郵箱提取);
re.search的group默認值是0,返回的是字符串,若是指定group的話返回的是各個分組合並的元組。
phonenum_find=phonenum_regex.findall(txt)#re.findall
print('打印findall結果',phonenum_find,'findall的類型',type(phonenum_find))
phonenum_search=phonenum_regex.search(txt)#re.search
print('打印search:',phonenum_search,'search的類型',type(phonenum_search))
print('打印search.groups:',phonenum_search.groups(),'search.groups的類型',type(phonenum_search.groups()))
print('打印search.group:',phonenum_search.group(),'search.group的類型',type(phonenum_search.group()))
print('打印search.group0:',phonenum_search.group(0),'search.group0的類型',type(phonenum_search.group(0)))
print('打印search.group1,2:',phonenum_search.group(1,2),'search.group1,2的類型',type(phonenum_search.group(1,2)))
#結果:
打印findall結果 [('0731', '-', '83333444'), ('0731', '-', '81112222')] findall的類型 <class 'list'>
打印search: <re.Match object; span=(56, 69), match='0731-83333444'> search的類型 <class 're.Match'>
打印search.groups: ('0731', '-', '83333444') search.groups的類型 <class 'tuple'>
打印search.group: 0731-83333444 search.group的類型 <class 'str'>
打印search.group0: 0731-83333444 search.group0的類型 <class 'str'>
打印search.group1,2: ('0731', '-') search.group1,2的類型 <class 'tuple'>
從結果上發現:findall輸出的是列表,search.groups輸出的是元組,search.group等同於search.group(0),輸出的是字符串,search.group輸出多個組時是字符串組成的元組。
4.findall的元組轉換爲列表
phonenum_list=[]
for groups in phonenum_find:
g_list=[]
for g in groups:
g_list.append(g)
phonenum_list.append(''.join(g_list))
print('打印find轉換後的list',phonenum_list)
#結果
打印find轉換後的list ['0731-83333444', '0731-81112222']
5.郵箱提取的正則表達式,沒有用到分組
email_regex=re.compile(r''' #r表示傳入原始字符
[\w\d.-]+ #郵箱前綴,多是任意長度的字母,數字,和點
@ #@字符
[\w\d.-]+ #域的名字好比hotmail
\.[\w]{2,4} | \.[\w]{2,4}\.[\w]{2,4} #後綴,好比com或者.com.cn
''',re.VERBOSE) #re.VERBOSE增長可讀性,忽略空格和 # 後面的註釋
6.查看re.findall和re.search的區別
phonenum_find=phonenum_regex.findall(txt)
email_find=email_regex.findall(txt)
email_search=email_regex.search(txt)
print('打印郵箱find',email_find)
print('打印郵箱search.group',email_search.group())
print('打印郵箱search.group0',email_search.group(0))
print('打印郵箱search.groups',email_search.groups())
print('打印郵箱search.group1',email_search.group(1))#會出錯
結果
打印郵箱find ['alice_love@gmail.com', 'bob.a@gmail.com']
打印郵箱search.group alice_love@gmail.com
打印郵箱search.group0 alice_love@gmail.com
打印郵箱search.groups ()
打印search.groups會提示IndexError: no such group,由於沒有組
整個程序代碼:
import re #正則匹配的文本 txt=''' Alice's phone number is 13300001234,telphone number is 0731-833334444,and her email is alice_love@gmail.com. Bob's phone number is (086)13300001234,telphone number is (0731)-81112222,and her email is bob.a@gmail.com. ''' #電話號碼正則表達式 phonenum_regex=re.compile(r''' #r表示傳入原始字符 \(? #有或者沒有括號 (\d{4}) #4個數字做爲區號 \)? #有或者沒有括號 (\s|-|\.)? #分隔符,空格、‘-’或者‘.’,無關緊要 (\d{8}) #8個數字做爲電話號碼 ''',re.VERBOSE) #re.VERBOSE增長可讀性,忽略空格和 # 後面的註釋 #re.find和re.search phonenum_find=phonenum_regex.findall(txt)#re.findall print('打印findall結果',phonenum_find,'findall的類型',type(phonenum_find)) phonenum_search=phonenum_regex.search(txt)#re.search print('打印search:',phonenum_search,'search的類型',type(phonenum_search)) print('打印search.groups:',phonenum_search.groups(),'search.groups的類型',type(phonenum_search.groups())) print('打印search.group:',phonenum_search.group(),'search.group的類型',type(phonenum_search.group())) print('打印search.group0:',phonenum_search.group(0),'search.group0的類型',type(phonenum_search.group(0))) print('打印search.group1,2:',phonenum_search.group(1,2),'search.group1,2的類型',type(phonenum_search.group(1,2))) phonenum_list=[] #轉換findall的結果爲list for groups in phonenum_find: g_list=[] for g in groups: g_list.append(g) phonenum_list.append(''.join(g_list)) print('打印find轉換後的list',phonenum_list) #郵件的提取正則表達式 email_regex=re.compile(r''' #r表示傳入原始字符 [\w\d.-]+ #郵箱前綴,多是任意長度的字母,數字,和點 @ #@字符 [\w\d.-]+ #域的名字好比hotmail \.[\w]{2,4} | \.[\w]{2,4}\.[\w]{2,4} #後綴,好比com或者.com.cn ''',re.VERBOSE) #re.VERBOSE增長可讀性,忽略空格和 # 後面的註釋 #re.find和re.search phonenum_find=phonenum_regex.findall(txt) email_find=email_regex.findall(txt) email_search=email_regex.search(txt) print('打印郵箱find',email_find) print('打印郵箱search.group',email_search.group()) print('打印郵箱search.group0',email_search.group(0)) print('打印郵箱search.groups',email_search.groups()) print('打印郵箱search.group1',email_search.group(1))