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 1.6中正确使用 Signal
Jun 22 Python
跟老齐学Python之用Python计算
Sep 12 Python
python实现的文件同步服务器实例
Jun 02 Python
Python中数字以及算数运算符的相关使用
Oct 12 Python
Python多进程multiprocessing用法实例分析
Aug 18 Python
python实现批量按比例缩放图片效果
Mar 30 Python
Python 字符串转换为整形和浮点类型的方法
Jul 17 Python
numpy中loadtxt 的用法详解
Aug 03 Python
Win 10下Anaconda虚拟环境的教程
May 18 Python
Python读取多列数据以及用matplotlib制作图表方法实例
Sep 23 Python
python 实现定时任务的四种方式
Apr 01 Python
Python经常使用的一些内置函数
Apr 11 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
改德生G88 - 加装等响度低音提升电路
2021/03/02 无线电
多php服务器实现多session并发运行
2006/10/09 PHP
?繁体转换的class
2006/10/09 PHP
Javascript 键盘keyCode键码值表
2009/12/24 Javascript
热点新闻滚动特效的js代码
2013/08/17 Javascript
逐一介绍Jquery data()、Jquery stop()、jquery delay()函数(详)
2015/11/04 Javascript
基于jQuery实现的仿百度首页滑动选项卡效果代码
2015/11/16 Javascript
Bootstrap每天必学之级联下拉菜单
2016/03/27 Javascript
Bootstrap Paginator分页插件与ajax相结合实现动态无刷新分页效果
2016/05/27 Javascript
AngularJS入门教程之AngularJS 模板
2016/08/18 Javascript
BootstrapTable请求数据时设置超时(timeout)的方法
2017/01/22 Javascript
js实现移动端编辑添加地址【模仿京东】
2017/04/28 Javascript
Vue2.0学习之详解Vue 组件及父子组件通信
2017/12/12 Javascript
简化vuex的状态管理方案的方法
2018/06/02 Javascript
基于React+Redux的SSR实现方法
2018/07/03 Javascript
vue-quill-editor+plupload富文本编辑器实例详解
2018/10/19 Javascript
基于 jQuery 实现键盘事件监听控件
2019/04/04 jQuery
简单了解vue中父子组件如何相互传递值(基础向)
2019/07/12 Javascript
webpack+vue-cil 中proxyTable配置接口地址代理操作
2020/07/18 Javascript
python通过pil模块获得图片exif信息的方法
2015/03/16 Python
在Python中使用NLTK库实现对词干的提取的教程
2015/04/08 Python
Python Requests安装与简单运用
2016/04/07 Python
Python多进程库multiprocessing中进程池Pool类的使用详解
2017/11/24 Python
python实现合并两个排序的链表
2019/03/03 Python
python利用Opencv实现人脸识别功能
2019/04/25 Python
10款最好的Python开发编辑器
2019/07/03 Python
Python 列表反转显示的四种方法
2020/11/16 Python
HTML5 使用 sessionStorage 进行页面传值的方法
2018/07/02 HTML / CSS
亚洲独特体验旅游专家:eOasia
2018/08/15 全球购物
校长先进事迹材料
2014/02/01 职场文书
满月酒主持词
2014/03/27 职场文书
松材线虫病防治方案
2014/06/15 职场文书
逃课打麻将检讨书
2014/10/05 职场文书
2014年煤矿工作总结
2014/11/24 职场文书
辞职申请书范本
2019/05/20 职场文书
python urllib库的使用详解
2021/04/13 Python