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的Django框架加载模版的方式
Jul 20 Python
Python的面向对象编程方式学习笔记
Jul 12 Python
Python编程判断一个正整数是否为素数的方法
Apr 14 Python
python语言中with as的用法使用详解
Feb 23 Python
对numpy中的数组条件筛选功能详解
Jul 02 Python
Django如何自定义分页
Sep 25 Python
Python利用scapy实现ARP欺骗的方法
Jul 23 Python
python实现爱奇艺登陆密码RSA加密的方法示例详解
May 27 Python
Python文件夹批处理操作代码实例
Jul 21 Python
python 操作excel表格的方法
Dec 05 Python
python源文件的字符编码知识点详解
Mar 04 Python
python实现大文本文件分割成多个小文件
Apr 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
一个用于MySQL的PHP XML类
2006/10/09 PHP
php 计算两个时间戳相隔的时间的函数(小时)
2009/12/18 PHP
IP138 IP地址查询小偷实现代码
2010/02/15 PHP
PHP中isset()和unset()函数的用法小结
2014/03/11 PHP
js 创建快捷方式的代码(fso)
2010/11/19 Javascript
一个不错的仿携程自定义数据下拉选择select
2014/09/01 Javascript
Bootstrap每天必学之缩略图与警示窗
2015/11/29 Javascript
jquery判断复选框选中状态以及区分attr和prop
2015/12/18 Javascript
jQuery中hover与mouseover和mouseout的区别分析
2015/12/24 Javascript
移动端 一个简单易懂的弹出框
2016/07/06 Javascript
深入对Vue.js $watch方法的理解
2017/03/20 Javascript
JS使用插件cryptojs进行加密解密数据实例
2017/05/11 Javascript
Node.js 8 中的重要新特性
2017/06/28 Javascript
es6学习之解构时应该注意的点
2017/08/29 Javascript
简单介绍react redux的中间件的使用
2018/04/06 Javascript
微信小程序如何实现精确的日期时间选择器
2020/01/21 Javascript
详解vue beforeEach 死循环问题解决方法
2020/02/25 Javascript
如何基于filter实现网站整体变灰功能
2020/04/17 Javascript
[02:57]2014DOTA2国际邀请赛-观众采访
2014/07/19 DOTA
Python程序中用csv模块来操作csv文件的基本使用教程
2016/03/03 Python
python利用百度AI实现文字识别功能
2018/11/27 Python
Python openpyxl 遍历所有sheet 查找特定字符串的方法
2018/12/10 Python
python 如何将数据写入本地txt文本文件的实现方法
2019/09/11 Python
python opencv 图像边框(填充)添加及图像混合的实现方法(末尾实现类似幻灯片渐变的效果)
2020/03/09 Python
python 通过exifread读取照片信息
2020/12/24 Python
详解html5页面 rem 布局适配方法
2018/01/12 HTML / CSS
使用canvas压缩图片大小的方法示例
2019/08/02 HTML / CSS
Rakuten Kobo台湾:电子书、eReaders和Reading应用程式
2017/11/24 全球购物
医学实习生自我鉴定
2013/12/12 职场文书
《李广射虎》教学反思
2014/04/27 职场文书
小学教师师德演讲稿
2014/05/06 职场文书
法院反腐倡廉心得体会
2014/09/09 职场文书
大学生党员自我批评思想汇报
2014/10/10 职场文书
2014年体育教师工作总结
2014/12/03 职场文书
《分一些蚊子进来》读后感3篇
2020/01/09 职场文书
GitHub上77.9K的Axios项目有哪些值得借鉴的地方详析
2021/06/15 Javascript