python re的findall和finditer的区别详解
作者:_假象 发布时间:2022-05-19 23:04:33
标签:python,re.findall,re.finditer
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()代表整个正则的匹配
实际中我们根据我们的需求选择方法既可。
来源:https://blog.csdn.net/wali_wang/article/details/50623991


猜你喜欢
- django静态文件配置原理静态文件配置就是为了让用户请求时django服务器能找到静态文件返回。首先要理解几个概念:媒体文件:用户上传的文
- 1.substring_index函数的语法及其用法(1)语法:substring_index(string,sep,num)即substr
- 什么是Lambda表达式“Lambda 表达式”(lambda expression)是一个匿名函数,Lambda表达式基于数学中的λ演算得
- 比如有下面一段代码: for i in range(10): print ("%s" % (f_list[i].name
- 这两条是关于IE环境中的CSS的。不要使用import引入CSS,可以避免内容的无样式瞬间(FOUC)问题。不要把样式的link放到页面后(
- <input name="a" type="checkbox"
- 用Pdb调试有多种方式使用 Pdb调试 Python的程序的方式主要是下面的三种!下面逐一介绍命令行加-m参数命令行启动目标程序,加上-m参
- Merge函数的用法简单来说Merge函数相当于Excel中的vlookup函数。当我们对2个表进行数据合并的时候需要通过指定两个表中相同的
- 我就废话不多说了,直接上代码吧!import matplotlibmatplotlib.use('Agg')import o
- 学习了Go语言后,打算利用最近比较空一点,写一个前端部署工具,不需要每次都复制粘贴的麻烦,我们希望再部署开始之前和部署结束后推送钉钉消息创建
- PyQt5布局控件QHBoxLayout简介采用QBOXLayout类可以在水平和垂直方向上排列控件,QHBoxLayout和QVBoxLa
- 什么是RC4算法呢?也许您还不知道,没关系我为您找了下相关资料方便大家查看;RC4加密算法 RC4加密算法是大名鼎鼎的RSA三人组
- pygame创建游戏窗口界面,供大家参考,具体内容如下使用pygame前一定要先导入pygame而且肯定要先初始化pygameimport
- javascript实现炫酷的拖动分页js<html><head><title>拖动分页</tit
- 本文实例为大家分享了Vue+ Antv F2实现层叠柱状图的具体代码,供大家参考,具体内容如下一、 创建canvas标签<canvas
- 0 背景由于工作需要,利用spark完成机器学习。因此需要对spark集群进行操作。所以利用pycharm和pyspark远程连接spark
- 在项目文件中新建文件.env .env.pro 两个文件其中.env 是默认设置 .env.pro 为正式环境设置1、设置.env中的内容信
- 基于MNIST数据集的逻辑回归模型做十分类任务没有隐含层的Softmax Regression只能直接从图像的像素点推断是哪个数字,而没有特
- 我在配置mysql时将配置文件中的默认存储引擎设定为了InnoDB。今天查看了MyISAM与InnoDB的区别,在该文中的第七条“MyISA
- 简介:1、global是Python中的全局变量关键字。2、全局变量是编程术语中的一种,源自于变量之分。3、变量分为局部与全局,局部变量又可