3分钟内理解Python的re模块中match、search、findall、finditer的区别

时间:2022-06-10 22:33:32

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