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

猜你喜欢

转载自blog.csdn.net/tp7309/article/details/72823258