python re的findall和finditer的区别详解


Posted in Python onNovember 15, 2020

python正则模块re中findall和finditer两者相似,但却有很大区别。 

两者都可以获取所有的匹配结果,这和search方法有着很大的区别,同时不同的是一个返回list,一个返回一个MatchObject类型的iterator

假设我们有这样的数据:其中数字代表电话号,xx代表邮箱类型

content = '''email:12345678@163.com
email:2345678@163.com
email:345678@163.com
'''

需求:(正则没有分组)提取所有的邮箱信息

result_finditer = re.finditer(r"\d+@\w+.com", content)
#由于返回的为MatchObject的iterator,所以我们需要迭代并通过MatchObject的方法输出
for i in result_finditer :
  print i.group()

result_findall = re.findall(r"\d+@\w+.com", content)
#返回一个[] 直接输出or或者循环输出
print result_findall
for i in result_findall :
  print i

需求:(正则有分组)提取出来所有的电话号码和邮箱类型

result_finditer = re.finditer(r"(\d+)@(\w+).com", content)
#正则有两个分组,我们需要分别获取分区,分组从0开始,group方法不传递索引默认为0,代表了整个正则的匹配结果
for i in result_finditer :
  phone_no = i.group(1)
  email_type = i.group(2)

result_findall = re.findall(r"(\d+)@(\w+).com", content)
#此时返回的虽然为[],但不是简单的[],而是一个tuple类型的list 
#如:[('12345678', '163'), ('2345678', '163'), ('345678', '163')]
for i in result_findall :
  phone_no = i[0]
  email_type = i[1]

命名分组和非命名分组的情况是一样的。

findall注意点:

1.当正则没有分组是返回的就是正则的匹配

re.findall(r"\d+@\w+.com", content)
['2345678@163.com', '2345678@163.com', '345678@163.com']

2.有一个分组返回的是分组的匹配而不是整个正则的匹配

re.findall(r"(\d+)@\w+.com", content)
['2345678', '2345678', '345678']

3.多个分组时将分组装到tuple中 返回

re.findall(r"(\d+)@(\w+).com", content)
[('2345678', '163'), ('2345678', '163'), ('345678', '163')]

因此假如我们需要拿到整个正则和每个分组的匹配,使用findall我们需要将整个正则作为一个分组

re.findall(r"((\d+)@(\w+).com)", content)
[('2345678@163.com', '2345678', '163'), ('2345678@163.com', '2345678', '163'), ('345678@163.com', '345678', '163')]

而使用finditer我们无需手动将整个正则用()括起来group()代表整个正则的匹配

实际中我们根据我们的需求选择方法既可。

到此这篇关于python re的findall和finditer的区别详解的文章就介绍到这了,更多相关python re的findall和finditer内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python发送邮件功能实现代码
Jul 15 Python
python 文件操作api(文件操作函数)
Aug 28 Python
python对于requests的封装方法详解
Jan 03 Python
python 五子棋如何获得鼠标点击坐标
Nov 04 Python
python DataFrame转dict字典过程详解
Dec 26 Python
Python内存映射文件读写方式
Apr 24 Python
解析Tensorflow之MNIST的使用
Jun 30 Python
如何让python的运行速度得到提升
Jul 08 Python
Python pandas对excel的操作实现示例
Jul 21 Python
python中实现栈的三种方法
Dec 19 Python
python中四舍五入的正确打开方式
Jan 18 Python
在Pycharm中安装Pandas库方法(简单易懂)
Feb 20 Python
Python获取android设备cpu和内存占用情况
Nov 15 #Python
Python __slots__的使用方法
Nov 15 #Python
Python descriptor(描述符)的实现
Nov 15 #Python
基于OpenCV的网络实时视频流传输的实现
Nov 15 #Python
彻底解决Python包下载慢问题
Nov 15 #Python
Python eval函数原理及用法解析
Nov 14 #Python
Django怎么在admin后台注册数据库表
Nov 14 #Python
You might like
php 错误处理经验分享
2011/10/11 PHP
php强制用户转向www域名的方法
2015/06/19 PHP
php实现图片等比例缩放代码
2015/07/23 PHP
学习PHP的数组总结【经验】
2016/05/05 PHP
PHP实现求解最长公共子串问题的方法
2017/11/17 PHP
Laravel5.1 框架响应基本用法实例分析
2020/01/04 PHP
HTML IMG标签 onload 内存溢出导致浏览器CPU占用过高
2021/03/09 Javascript
共享自己写一个框架DreamScript
2007/01/20 Javascript
js计算页面刷新的次数
2009/07/20 Javascript
jQuery 性能优化手册 推荐
2010/02/23 Javascript
用Juery网页选项卡实现代码
2011/06/13 Javascript
js中document.write的那点事
2014/12/12 Javascript
使用JS获取当前地理位置方法汇总
2014/12/18 Javascript
使用javascript实现Iframe自适应高度
2014/12/24 Javascript
js判断手机号运营商的方法
2015/10/23 Javascript
跟我学习javascript创建对象(类)的8种方法
2015/11/20 Javascript
jQuery Easyui datagrid editor为combobox时指定数据源实例
2016/12/19 Javascript
详解Immutable及 React 中实践
2018/03/01 Javascript
Vue实现导航栏菜单
2020/08/19 Javascript
Javascript柯里化实现原理及作用解析
2020/10/22 Javascript
python互斥锁、加锁、同步机制、异步通信知识总结
2018/02/11 Python
Windows下Python3.6安装第三方模块的方法
2018/11/22 Python
Python实现获取系统临时目录及临时文件的方法示例
2019/06/26 Python
Python字符编码转码之GBK,UTF8互转
2020/02/09 Python
pycharm激活码免费分享适用最新pycharm2020.2.3永久激活
2020/11/25 Python
德国内衣、泳装和睡衣网上商店:Bigsize Dessous
2018/07/09 全球购物
如何打印出当前源文件的文件名以及源文件的当前行号
2015/04/05 面试题
药学专业毕业生求职信
2013/10/20 职场文书
医学院四年学习生活的自我评价
2013/11/06 职场文书
大学共青团员个人自我评价
2014/04/16 职场文书
2014幼儿园家长工作总结
2014/11/10 职场文书
社区活动总结
2015/02/04 职场文书
2015年度学校应急管理工作总结
2015/10/22 职场文书
css实现左上角飘带效果的完整代码
2022/03/18 HTML / CSS
Python基本知识点总结
2022/04/07 Python
python blinker 信号库
2022/05/04 Python