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中使用next()方法操作文件的教程
May 24 Python
简单了解python中对象的取反运算符
Jul 01 Python
详解python中的生成器、迭代器、闭包、装饰器
Aug 22 Python
Python缓存技术实现过程详解
Sep 25 Python
浅析python中while循环和for循环
Nov 19 Python
Python 列表的清空方式
Jan 13 Python
在pycharm中实现删除bookmark
Feb 14 Python
windows下Pycharm安装opencv的多种方法
Mar 05 Python
python 实现任务管理清单案例
Apr 25 Python
python 日志模块logging的使用场景及示例
Jan 04 Python
教你如何用python开发一款数字推盘小游戏
Apr 14 Python
OpenCV-Python使用cv2实现傅里叶变换
Jun 09 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实现手机号码中间四位用星号(*)隐藏的自定义函数分享
2014/09/27 PHP
php实现excel中rank函数功能的方法
2015/01/20 PHP
php实现只保留mysql中最新1000条记录
2015/06/18 PHP
PHP的Yii框架中使用数据库的配置和SQL操作实例教程
2016/03/17 PHP
PHP+Ajax实现的检测用户名功能简单示例
2019/02/12 PHP
找到一点可怜的关于dojo资料,谢谢作者!
2006/12/06 Javascript
jQuery学习4 浏览器的事件模型
2010/02/07 Javascript
在Javascript里访问SharePoint列表数据的实现方法
2011/05/22 Javascript
JavaScript中“过于”犀利地for/in循环使用示例
2013/10/22 Javascript
JavaScript的strict模式与with关键字介绍
2014/02/08 Javascript
JavaScript汉诺塔问题解决方法
2015/04/21 Javascript
Jquery中$.post和$.ajax的用法小结
2015/04/28 Javascript
微信小程序实现鼠标拖动效果示例
2017/12/01 Javascript
浅谈node模块与npm包管理工具
2018/01/03 Javascript
vue2.0 如何在hash模式下实现微信分享
2019/01/22 Javascript
vue-cli 项目打包完成后运行文件路径报错问题
2019/07/19 Javascript
vue使用高德地图点击下钻上浮效果的实现思路
2019/10/12 Javascript
vue实现前端列表多条件筛选
2020/10/26 Javascript
ssh批量登录并执行命令的python实现代码
2012/05/25 Python
python实现每次处理一个字符的三种方法
2014/10/09 Python
Python网络编程使用select实现socket全双工异步通信功能示例
2018/04/09 Python
python读取文本中的坐标方法
2018/10/14 Python
对Python+opencv将图片生成视频的实例详解
2019/01/08 Python
使用Python实现跳一跳自动跳跃功能
2019/07/10 Python
python反转列表的三种方式解析
2019/11/08 Python
Python语法之精妙的十个知识点(装B语法)
2020/01/18 Python
关于Tensorflow使用CPU报错的解决方式
2020/02/05 Python
Django 自定义权限管理系统详解(通过中间件认证)
2020/03/11 Python
基于 Python 实践感知器分类算法
2021/01/07 Python
详解HTML5新增标签
2017/11/27 HTML / CSS
英国女鞋购物网站:Moda in Pelle
2019/02/18 全球购物
售前工程师职业生涯规划
2014/03/02 职场文书
中学生运动会新闻稿
2014/09/24 职场文书
银行反四风对照检查材料
2014/09/29 职场文书
毕业论文答辩演讲稿
2015/06/23 职场文书
Python基础之元类详解
2021/04/29 Python