[原]Python爬虫编程思想(34):使用findall和finditer查找每一次出现的位置
2021-09-25 22:56:21 Author: blog.csdn.net(查看原文) 阅读量:33 收藏

        findall函数用于查询字符串中某个正则表达式模式全部的非重复出现情况,这一点与search函数在执行字符串搜索时类似,但与match函数与search函数不同之处在于,findall函数总是返回一个包含搜索结果的列表,如果findall函数没有找到匹配的部分,就会返回一个空列表,如果匹配成功,列表将包含所有成功的匹配部分(从左向右按匹配顺序排列)。

result = re.findall('bike', 'bike')
# 运行结果:['bike']
print(result)		
result = re.findall('bike', 'My bike')
# 运行结果:['bike']
print(result)
# 运行结果:['bike', 'bike']
result = re.findall('bike', 'This is a bike. This is my bike.')
print(result)

        finditer函数在功能上与findall函数类似,只是更节省内存。这两个函数的区别是findall函数会将所有匹配的结果一起通过列表返回,而finditer函数会返回一个迭代器,只有对finditer函数返回结果进行迭代,才会对字符串中某个正则表达式模式进行匹配。findall函数与finditer函数相当于读取XML文档的两种技术:DOM和SAX。前者更灵活,但也更耗内存资源,后者顺序读取XML文档的内容,不能随机读取XML文档中的内容,但更节省内存资源。

        下面的案例演示了findall函数和finditer函数的用法,读者可通过本例的代码对这两个函数进行对比。

import re
# 待匹配的字符串
s = '12-a-abc54-a-xyz---78-A-ytr'
# 匹配以2个数字开头,结尾是3个小写字母,中间用“-a”分隔的字符串,对大小写敏感
# 下面的代码都使用了同样的模式字符串
result = re.findall(r'\d\d-a-[a-z]{3}',s)
# 运行结果:['12-a-abc', '54-a-xyz']
print(result)                   
# 将模式字符串加了两个分组(用圆括号括起来的部分),findall方法也会以分组形式返回
result = re.findall(r'(\d\d)-a-([a-z]{3})',s)
# 运行结果:[('12', 'abc'), ('54', 'xyz')]
print(result)
# 忽略大小写(最后一个参数值:re.I)
result = re.findall(r'\d\d-a-[a-z]{3}',s,re.I)
# 运行结果:['12-a-abc', '54-a-xyz', '78-A-ytr']
print(result)
# 忽略大小写,并且为模式字符串加了2个分组
result = re.findall(r'(\d\d)-a-([a-z]{3})',s,re.I)
# 运行结果:[('12', 'abc'), ('54', 'xyz'), ('78', 'ytr')]
print(result)
# 使用finditer函数匹配模式字符串,并返回匹配迭代器
it = re.finditer(r'(\d\d)-a-([a-z]{3})',s,re.I)
# 对迭代器进行迭代
for result in it:
print(result.group(),end=' < ')
# 获取每一个迭代结果中组的所有的值
groups = result.groups()
# 对分组进行迭代
    for i in groups:
        print(i,end = ' ')
    print('>')

程序运行结果如图1所示。

         不管是findall函数,还是finditer函数,都可以通过第3个参数指定re.I,将匹配方式设为大小写不敏感。如果为模式字符串加上分组,那么findall函数就会返回元组形式的结果(列表的每一个元素是一个分组)。


文章来源: https://blog.csdn.net/nokiaguy/article/details/120478306
如有侵权请联系:admin#unsafe.sh