使用findall和finditer查找每一次出现的位置
findall函数用于查询字符串中某个正则表达式模式全部的非重复出现的情况,这一点与search函数在执行字符串搜索时类似,但与match函数和search函数不同之处在于,findall函数总是返回一个包含搜索结果的列表。如果findall函数没有找到匹配的部分,就会返回一个空列表,如果匹配成功,列表将包含所有成功的匹配部分(从左到右按匹配顺序排列)。
复制代码
1
2
3
4
5
6
7
8import re result = re.findall('bike','bike') print(result) result = re.findall('bike','My bike') print(result) result = re.findall('bike','This is a bike. This is my bike.') print(result)
输出结果:
复制代码
1
2
3
4['bike'] ['bike'] ['bike', 'bike']
finditer函数在功能上与findall函数类似,只是更节省内存。这两个函数的区别是findall函数会将所有匹配的结果一起通过列表返回,而finditer函数会返回一个迭代器,只有对finditer函数返回结果进行迭代,才会对字符串中某个正则表达式模式进行匹配。findall函数与finditer函数相当于读取XML文档的两种技术:DOM和SAX。前者更灵活,但也更耗内存资源;后者顺序读取XML文档的内容,不能随机读取XML文档中的内容,但更节省内存资源。
[例 11.9] 本例演示了findall函数和finditer函数的用法,可以通过本例的代码对这两个函数进行对比。
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18import re s = '12-a-abc54-a-xyz---78-A-ytr' result = re.findall(r'dd-a-[a-z]{3}',s) print(result) result = re.findall(r'(dd)-a-([a-z]{3})',s) print(result) result = re.findall(r'dd-a-[a-z]{3}',s,re.I) print(result) result = re.findall(r'(dd)-a-([a-z]{3})',s,re.I) print(result) it = re.finditer(r'(dd)-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
2
3
4
5
6
7
8
9
10
11['12-a-abc', '54-a-xyz'] [('12', 'abc'), ('54', 'xyz')] ['12-a-abc', '54-a-xyz', '78-A-ytr'] [('12', 'abc'), ('54', 'xyz'), ('78', 'ytr')] 12-a-abc < 12 abc > 54-a-xyz < 54 xyz > 78-A-ytr < 78 ytr >
不管是findall函数,还是finditer函数,都可以通过第3个参数指定re.I,将匹配方式设为大小写不敏感。如果模式字符串加上分组,那么findall函数就会返回元组形式的结果(列表的每一个元素是一个分组)。
最后
以上就是醉熏糖豆最近收集整理的关于Python进阶之路 高级编程 正则表达式-使用findall和finditer查找每一次出现的位置的全部内容,更多相关Python进阶之路内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复