Python 正則表達式舉例:re.match與re.findall區別

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))
相關文章
相關標籤/搜索