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 相关文章推荐
使用django-suit为django 1.7 admin后台添加模板
Nov 18 Python
调试Python程序代码的几种方法总结
Apr 28 Python
Python中datetime常用时间处理方法
Jun 15 Python
python中字符串比较使用is、==和cmp()总结
Mar 18 Python
Python生成验证码、计算具体日期是一年中的第几天实例代码详解
Oct 16 Python
Django实现分页显示效果
Oct 31 Python
Python大数据之使用lxml库解析html网页文件示例
Nov 16 Python
python生成特定分布数的实例
Dec 05 Python
Python socket连接中的粘包、精确传输问题实例分析
Mar 24 Python
pyecharts动态轨迹图的实现示例
Apr 17 Python
Python爬虫之Selenium实现关闭浏览器
Dec 04 Python
python中super()函数的理解与基本使用
Aug 30 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 缓存实现代码及详细注释
2010/05/16 PHP
php中使用cookie来保存用户登录信息的实现代码
2012/03/08 PHP
apache中为php 设置虚拟目录
2014/12/17 PHP
apache集成php7.3.5的详细步骤
2019/06/20 PHP
面向对象Javascript核心支持代码分享
2012/05/23 Javascript
Google Map V3 绑定气泡窗口(infowindow)Dom事件实现代码
2013/04/26 Javascript
a标签的href和onclick 的事件的区别介绍
2013/07/26 Javascript
JS小功能(操作Table--动态添加删除表格及数据)实现代码
2013/11/28 Javascript
有效提高JavaScript执行效率的几点知识
2015/01/31 Javascript
NodeJs基本语法和类型
2015/02/13 NodeJs
JS实现仿QQ聊天窗口抖动特效
2015/05/10 Javascript
解决jquery实现的radio重新选中的问题
2015/07/03 Javascript
js简单判断flash是否加载完成的方法
2016/06/21 Javascript
Javascript实现图片不间断滚动的代码
2016/06/22 Javascript
vue和react等项目中更简单的实现展开收起更多等效果示例
2018/02/22 Javascript
详解JS函数stack size计算方法
2018/06/18 Javascript
JS 验证码功能的三种实现方式
2018/11/26 Javascript
vue 中 命名视图的用法实例详解
2019/08/14 Javascript
浅谈Vue中render中的h箭头函数
2019/11/07 Javascript
js实现倒计时秒杀效果
2020/03/25 Javascript
Python通过PIL获取图片主要颜色并和颜色库进行对比的方法
2015/03/19 Python
python 查找字符串是否存在实例详解
2017/01/20 Python
python中的字符串内部换行方法
2018/07/19 Python
mac安装pytorch及系统的numpy更新方法
2018/07/26 Python
在Django中实现添加user到group并查看
2019/11/18 Python
Python with语句用法原理详解
2020/07/03 Python
CSS3动画之流彩文字效果+图片模糊效果+边框伸展效果实现代码合集
2017/08/18 HTML / CSS
将"引用"作为函数返回值类型的格式、好处和需要遵守的规则
2016/02/09 面试题
建筑专业毕业生推荐信
2013/11/21 职场文书
团代会主持词
2014/04/02 职场文书
毕业生简历自我评价范文
2014/04/09 职场文书
企业指导教师评语
2014/04/28 职场文书
亲子阅读的活动方案
2014/08/15 职场文书
竞选班干部演讲稿500字
2014/08/20 职场文书
群众路线教育实践活动个人对照检查材料思想汇报(社区班子)
2014/10/06 职场文书
Redis keys命令的具体使用
2022/06/05 Redis