天天看點

3分鐘内了解Python的re子產品中match、search、findall、finditer的差別

re是Python中用于正規表達式相關處理的類,這四個方法都是用于比對字元串的,具體差別如下:

match

比對string 開頭,成功傳回Match object, 失敗傳回None,隻比對一個。

search

在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(), match.group(), match.group())  

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

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

輸出:

None 

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

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

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

試着把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(), match.group())  

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

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

輸出:

None 

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

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

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