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转码问题的解决方法
Oct 07 Python
Linux下使用python调用top命令获得CPU利用率
Mar 10 Python
Python线程的两种编程方式
Apr 14 Python
Python自动化部署工具Fabric的简单上手指南
Apr 19 Python
详解Python中 __get__和__getattr__和__getattribute__的区别
Jun 16 Python
python实现rsa加密实例详解
Jul 19 Python
python单例模式获取IP代理的方法详解
Sep 13 Python
Python Selenium 之关闭窗口close与quit的方法
Feb 13 Python
python获取交互式ssh shell的方法
Feb 14 Python
通过 Python 和 OpenCV 实现目标数量监控
Jan 05 Python
python安装sklearn模块的方法详解
Nov 28 Python
Python 图片添加美颜效果
Apr 28 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
全国FM电台频率大全 - 20 广西省
2020/03/11 无线电
php实现数据库的增删改查
2017/02/26 PHP
php-fpm服务启动脚本的方法
2018/04/27 PHP
定位地理位置PHP判断员工打卡签到经纬度是否在打卡之内
2019/05/23 PHP
又一个小巧的图片预加载类
2007/05/05 Javascript
ExtJs grid行 右键菜单的两种方法
2010/06/19 Javascript
jquery实现上下左右滑动的方法
2015/02/09 Javascript
jQuery实现自定义事件的方法
2015/04/17 Javascript
浅谈JavaScript前端开发的MVC结构与MVVM结构
2016/06/03 Javascript
jQuery实现的多张图无缝滚动效果【测试可用】
2016/09/12 Javascript
详解PHP中pathinfo()函数导致的安全问题
2017/01/05 Javascript
JS实现旋转木马式图片轮播效果
2017/01/18 Javascript
jquery Ajax实现Select动态添加数据
2017/06/08 jQuery
javascript实现文字无缝滚动效果
2017/08/26 Javascript
Vue3 源码导读(推荐)
2019/10/14 Javascript
js实现日历
2020/11/07 Javascript
vue动态设置路由权限的主要思路
2021/01/13 Vue.js
Python发送Email方法实例
2014/08/21 Python
Python的Flask框架中集成CKeditor富文本编辑器的教程
2016/06/13 Python
python+matplotlib实现礼盒柱状图实例代码
2018/01/16 Python
python几种常用功能实现代码实例
2019/12/25 Python
学习Python列表的基础知识汇总
2020/03/10 Python
Python web框架(django,flask)实现mysql数据库读写分离的示例
2020/11/18 Python
用css3实现转换过渡和动画效果
2020/03/13 HTML / CSS
东南亚地区最大的购物网站Lazada新加坡站点:Lazada.sg
2016/07/17 全球购物
Asics日本官网:鬼冢八喜郎创立的跑鞋运动品牌
2017/10/18 全球购物
周仰杰(JIMMY CHOO)法国官方网站:闻名世界的鞋子品牌
2019/09/27 全球购物
新加坡第一大健康与美容零售商:屈臣氏新加坡(Watsons Singapore)
2020/12/11 全球购物
北京泡泡网网络有限公司.net面试题
2012/07/17 面试题
大学生军训自我评价分享
2013/11/09 职场文书
门前三包责任书
2014/04/15 职场文书
新员工试用期自我鉴定
2014/04/17 职场文书
销售团队口号大全
2014/06/06 职场文书
2014年共青团工作总结
2014/12/10 职场文书
小学生通知书评语
2014/12/31 职场文书
庭外和解协议书
2016/03/23 职场文书