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中生成器和yield语句的用法详解
Apr 17 Python
Python引用模块和查找模块路径
Mar 17 Python
彻底理解Python list切片原理
Oct 27 Python
用Python登录好友QQ空间点赞的示例代码
Nov 04 Python
浅析python中numpy包中的argsort函数的使用
Aug 30 Python
python实现石头剪刀布程序
Jan 20 Python
PYQT5设置textEdit自动滚屏的方法
Jun 14 Python
pyqt5 键盘监听按下enter 就登陆的实例
Jun 25 Python
Python socket 套接字实现通信详解
Aug 27 Python
python用线性回归预测股票价格的实现代码
Sep 04 Python
python编写计算器功能
Oct 25 Python
python3利用Axes3D库画3D模型图
Mar 25 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与paypal整合方法
2010/11/28 PHP
php中session使用示例
2014/03/29 PHP
PHP准确取得服务器IP地址的方法
2015/06/02 PHP
PHP不使用内置函数实现字符串转整型的方法示例
2017/07/03 PHP
Laravel学习教程之request validation的编写
2017/10/25 PHP
JavaScript实现页面滚动图片加载(仿lazyload效果)
2011/07/22 Javascript
jquery 插件学习(五)
2012/08/06 Javascript
JavaScript 用cloneNode方法克隆节点的代码
2012/10/15 Javascript
jquery插件splitScren实现页面分屏切换模板特效
2015/06/16 Javascript
javascript实现状态栏中文字动态显示的方法
2015/10/20 Javascript
JS定义类的六种方式详解
2016/05/12 Javascript
基于chosen插件实现人员选择树搜索自动筛选功能
2016/09/24 Javascript
javascript简写常用的12个技巧(可以大大减少你的js代码量)
2020/03/28 Javascript
Vue实现美团app的影院推荐选座功能【推荐】
2018/08/29 Javascript
详解如何在微信小程序开发中正确的使用vant ui组件
2018/09/13 Javascript
JS集合set类的实现与使用方法示例
2019/02/01 Javascript
Vue v-text指令简单使用方法示例
2019/09/19 Javascript
JS实现无限轮播无倒退效果
2020/09/21 Javascript
Python利用IPython提高开发效率
2016/08/10 Python
Python探索之实现一个简单的HTTP服务器
2017/10/28 Python
python生成随机图形验证码详解
2017/11/08 Python
Python实现的朴素贝叶斯算法经典示例【测试可用】
2018/06/13 Python
python+numpy+matplotalib实现梯度下降法
2018/08/31 Python
python自带tkinter库实现棋盘覆盖图形界面
2019/07/17 Python
Python爬虫学习之翻译小程序
2019/07/30 Python
python脚本之一键移动自定格式文件方法实例
2019/09/02 Python
解决Pycharm双击图标启动不了的问题(JetBrains全家桶通用)
2020/08/07 Python
python邮件中附加文字、html、图片、附件实现方法
2021/01/04 Python
HTML5无刷新改变当前url的代码
2017/03/15 HTML / CSS
万豪国际住宅与别墅集团:Homes & Villas by Marriott International
2020/10/08 全球购物
简历中自我评价分享
2013/10/09 职场文书
写演讲稿所需要注意的4个条件
2014/01/09 职场文书
小学秋季运动会报道稿
2014/09/30 职场文书
公务员个人考察材料
2014/12/23 职场文书
eclipse创建项目没有dynamic web的解决方法
2021/06/24 Java/Android
python 中的jieba分词库
2021/11/23 Python