3分鐘內理解Python的re模塊中match、search、findall、finditer的區別

re是Python中用於正則表達式相關處理的類,這四個方法都是用於匹配字符串的,具體區別如下:

match

匹配string 開頭,成功返回Match object, 失敗返回None,只匹配一個。

string中進行搜索,成功返回Match object, 失敗返回None, 只匹配一個。

findall

在string中查找所有 匹配成功的組, 即用括號括起來的部分。返回list對象,每個list item是由每個匹配的所有組組成的list。

finditer

在string中查找所有 匹配成功的字符串, 返回iterator,每個item是一個Match object。

不多說概念,直接看栗子!

#!/usr/bin/env python
# -*- coding:utf-8 -*-

from __future__ import print_function
import re

content = '333STR1666STR299'
regex = r'([A-Z]+(\d))'

if __name__ == '__main__':
    print(re.match(regex, content)) ##content的開頭不符合正則,所以結果爲None。

    ##只會找一個匹配,match[0]是regex所代表的整個字符串,match[1]是第一個()中的內容,match[2]是第二對()中的內容。
    match = re.search(regex, content)
    print('\nre.search() return value: ' + str(type(match)))
    print(match.group(0), match.group(1), match.group(2))  

    result1 = re.findall(regex, content)
    print('\nre.findall() return value: ' + str(type(result1)))
    for m in result1:
        print(m[0], m[1])

    result2 = re.finditer(regex, content)
    print('\nre.finditer() return value: ' + str(type(result2)))
    for m in result2:
        print(m.group(0), m.group(1), m.group(2))  ##字符串

輸出:

None 

re.search() return value: <TYPE ?_sre.SRE_Match?>
STR1 STR1 1 

re.findall() return value: <TYPE ?list?>
STR1 1 STR2 2 

re.finditer() return value: <TYPE ?callable-iterator?>
STR1 STR1 1 
STR2 STR2 2

試着把regex最外邊的括號去掉,即regex = r'[A-Z]+(\d)',組的個數就會減少一個:

#!/usr/bin/env python
# -*- coding:utf-8 -*-

from __future__ import print_function
import re

content = '333STR1666STR299'
regex = r'[A-Z]+(\d)'

if __name__ == '__main__':
    print(re.match(regex, content)) ##content的開關不符合正則,所以結果爲None。

    ##只會找一個匹配,match[0]是regex所代表的整個字符串,match[1]是第一個()中的內容,match[2]是第二對()中的內容。
    match = re.search(regex, content)
    print('\nre.search() return value: ' + str(type(match)))
    print(match.group(0), match.group(1))  

    result1 = re.findall(regex, content)
    print('\nre.findall() return value: ' + str(type(result1)))
    for m in result1:
        print(m[0])

    result2 = re.finditer(regex, content)
    print('\nre.finditer() return value: ' + str(type(result2)))
    for m in result2:
        print(m.group(0), m.group(1))  ##字符串

輸出:

None 

re.search() return value: <TYPE ?_sre.SRE_Match?>
STR1 1 

re.findall() return value: <TYPE ?list?>
1 2 

re.finditer() return value: <TYPE ?callable-iterator?>
STR1 1 
STR2 2
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章