search方法扫描整个字符串,返回第一个成功的匹配。从方法功能描述中,我们可以得出以下结论:
假设目标字符串是这样的
我有3个电话号,分别是13343454523, 13341154523,13341152223
使用正则表达式来提取电话号
import re
text = '我有3个电话号,分别是13343454523, 13341154523,13341152223'
pattern = re.compile('(\d{11})')
res = pattern.search(text)
print(res.span())
print(res.groups())
程序输出结果
(11, 22)
('13343454523',)
search 只会返回第一个成功的匹配,那么问题来了,如果字符串里有多处匹配,就像上面的例子中,有3个电话号,想要全部提取,该怎么办呢?
search方法,允许你设置搜索的范围,提供一个开始的位置和一个结束的位置,默认是从索引0开始搜索,想要获取全部的匹配,则需要使用一个循环,上一次匹配的结束位置作为下一次匹配的开始位置,这样,就能返回全部的匹配,示例代码如下
import re
text = '我有3个电话号,分别是13343454523, 13341154523,13341152223'
pattern = re.compile('(\d{11})')
res = pattern.search(text)
lst = []
while res:
start, end = res.span()
lst.append(res.group(1))
res = pattern.search(text, start+1)
print(lst)
程序输出结果
['13343454523', '13341154523', '13341152223']
findall在字符串中找到所有正则表达式匹配的子串,并返回一个列表,如果没有找到,则返回空列表。
search方法可以通过设置搜索范围搜索所有匹配的子串,findall可以实现相同的功能,却不必一次次设置搜索范围
import re
text = '我有3个电话号,分别是13343454523, 13341154523,13341152223'
pattern = re.compile('(\d{11})')
res = pattern.findall(text)
print(res)
程序输出结果
['13343454523', '13341154523', '13341152223']
与findall的功能类似,不同之处在于,finditer返回的是一个迭代器
import re
text = '我有3个电话号,分别是13343454523, 13341154523,13341152223'
pattern = re.compile('(\d{11})')
res = pattern.finditer(text)
for item in res:
print(item.group())
程序输出结果
13343454523
13341154523
13341152223
QQ交流群: 211426309