Python中正则匹配使用findall时的注意事项
在使用正则搜索内容时遇到一个小坑,百度搜了一下,遇到这个坑的还不少,特此记录一下。
比如说有一个字符串 "123@qq.comaaa@163.combbb@126.comasdf111@asdfcom"
想匹配出里面所有的邮箱地址,该怎么实现呢?
写了个正则,测试一下:
>>> import re
>>> s = "123@qq.comaaa@163.combbb@126.comasdf111@asdfcom"
>>> pattern1 = "\w+@(qq|163|126)\.com"
>>> m1 = re.search(pattern1,s)
>>> m1.group()
'123@qq.com'
可以看到,能够正确搜索到第一个结果,正则写得没问题,如果我想得到所有结果,自然而然就想到了用findall()方法。来试试看:
>>> m2 = re.findall(pattern1,s)
>>> m2
['qq', '163', '126']
这时候估计很多人就觉得奇怪了,使用search方法能搜索到,说明正则写得没问题呀,为什么使用findall的时候结果是这个样子的?为什么结果不是整个邮箱字符串?
查了资料才清楚一个概念,叫做捕获分组。
简单说,就是正则表示式里出现括号的时候,括号里的内容匹配到的部分是会被作为结果输出的,而不是把整个正则表达式匹配到的内容作为结果输出。
所以,就出现了上面的结果了。
那怎么得到想要的结果呢?在Python里,当一个分组的头部出现"?:"时,表示这是一个非捕获分组,意思就是它只是正常参与匹配过程,但不作为独立的结果进行输出。
那么按这个写法来试试:
>>> pattern2 = "\w+@(?:qq|163|126)\.com"
>>> m2 = re.findall(pattern2,s)
>>> m2
['123@qq.com', 'aaa@163.com', 'bbb@126.com']
取消了这个捕获分组,那么就是把整个表达式作为一个结果输出,这样才是我们预期想要的效果。
这种情况在使用正则中的“或”匹配时是特别需要注意的,因为这时候通常会加括号,很多初学者很容易掉进这个坑,得到一个不知所谓的结果。
当然,捕获分组这个功能本来是正常有用的,只是要用对了才行。
比如,同样是刚才这个例子,如果只想要邮箱中的用户名部分,该怎么写正则表达式呢?
显然就是把用户名部分加括号作为一个捕获分组就可以了。
>>> pattern3 = "(\w+)@(?:qq|163|126)\.com"
>>> m3 = re.findall(pattern3,s)
>>> m3
['123', 'aaa', 'bbb']
对于findall()函数,其帮助是这么说明的:

findall函数,就是说在正则匹配里,如果有分组,就仅仅匹配分组里面的内容,然后返回这个组的列表; 如果有多个分组,那就把每一个分组看成一个单位,组合为一个元组,然后返回一个含有多个元组的列表。
分组这个功能还是比较强大的,以后会继续学习更多的部分。
参考文章:https://blog.csdn.net/qq_42739440/article/details/81117919
Python中正则匹配使用findall时的注意事项的更多相关文章
- Python中正则匹配使用findall,捕获分组(xxx)和非捕获分组(?:xxx)的差异
转自:https://blog.csdn.net/qq_42739440/article/details/81117919 下面是我在用findall匹配字符串时遇到的一个坑,分享出来供大家跳坑. 例 ...
- python中正则匹配之re模块
Python中正则表达式 re:re是提供正则表达式匹配操作的模块 一.什么是正则表达式 正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某个模式匹配,Python 自1.5版本起 ...
- 在python中使用print()时,raw write()返回无效的长度:OSError: raw write() returned invalid length 254 (should have been between 0 and 127)
写出一个不是code的bug,很烦恼,解决了挺长时间,都翻到外文来看,不过还是解决了,只尝试了一种简单可观的方法,希望对大家有用 我正在使用Django与Keras(tensorflow)来训练一个模 ...
- python - 手机号正则匹配
Python 手机号正则匹配 # -*- coding:utf-8 -*- import re def is_phone(phone): phone_pat = re.compile('^(13\d| ...
- Python中正则模块re.compile、re.match及re.search函数用法
import rehelp(re.compile)'''输出结果为:Help on function compile in module re: compile(pattern, flags=0) C ...
- 关于php中正则匹配包括换行符在内的任意字符的问题总结
要使用正则匹配任意字符的话,通常有以下几种方法,这里我分别对每一种方法在使用的过程中做一个总结: 第一种方式:[.\n]*? 示例 ? PHP preg_match_all('/<div cla ...
- python re 正则匹配 split sub
import re 编译: motif='([ST])Q' seq="SQAAAATQ" regrex=re.compile(motif) #编译成正则对象 regrex=re.c ...
- html中正则匹配img
1.正则匹配html中的img标签,取出img的url并进行图片文件下载: /// <summary> /// 将image标签的src属性的url替换为base64 /// </s ...
- python - re正则匹配模块
re模块 re 模块使 Python 语言拥有全部的正则表达式功能. compile 函数根据一个模式字符串和可选的标志参数生成一个正则表达式对象.该对象拥有一系列方法用于正则表达式匹配和替换. re ...
随机推荐
- 重新编译Nginx指导手册【修复静态编译Openssl的Nginx漏洞 】(转)
1. 概述 当前爆出了Openssl漏洞,会泄露隐私信息,涉及的机器较多,环境迥异,导致修复方案都有所不同.不少服务器使用的Nginx,是静态编译opensssl,直接将openssl编译到ng ...
- 【BZOJ1018】[SHOI2008]堵塞的交通traffic 线段树
[BZOJ1018][SHOI2008]堵塞的交通traffic Description 有一天,由于某种穿越现象作用,你来到了传说中的小人国.小人国的布局非常奇特,整个国家的交通系统可以被看成是一个 ...
- Dubbo服务集群,常见容错机制:failover ,failsafe,failfase ,failback,forking
http://blog.csdn.net/hongweigg/article/details/52925920 http://m.blog.csdn.net/article/details?id=51 ...
- C# 自定义控件制作和使用实例(winform)(转)
本例是制作一个简单的自定义控件,然后用一个简单的测试程序,对于初学者来说,本例子比较简单,只能起到抛石引玉的效果. 我也是在学习当中,今后会将自己所学的逐步写出来和大家交流共享. 第一步:新建一个 ...
- intellij idea jdk language level
jdk的新的版本会兼容旧的版本. 如果安装了新的jdk,但是还是希望使用旧版本的特性,这个可以使用jdk language level来实现. 比如安装了jdk8,但是希望用7,那么language ...
- squid代理缓存服务器
参考文章 http://www.cnblogs.com/mchina/p/3812190.html ;
- BTC、BCH和BSV三者到底有什么区别?
比特币发展到今天已经有10个年头了,在这十年的发展中,比特币一共经历了两次重要的分裂,现在变成了三种货币,第一种是目前继承了比特币绝大多数遗产的BTC:第二种是BCH:第三种是BSV.那这三种货币到底 ...
- 采集练习(十) php 获得电视节目预告---数据来自搜视网
前几天逛湖南卫视,偶然间发现它的网站上也有节目预告,一看源码,居然是来自搜视网的xml,于是就想获得它的数据(页面直接ajax加载估计会有跨域问题) 前阵子也写过另一个方法获得 节目预告(采集练习(七 ...
- 小记tensorflow-1:tf.nn.conv2d 函数介绍
tf.nn.conv2d函数介绍 Input: 输入的input必须为一个4d tensor,而且每个input的格式必须为float32 或者float64. Input=[batchsize,im ...
- 多线程(一) NSThread
OS中多线程的实现方案: 技术 语言 线程生命周期 使用频率 pthread C 程序员自行管理 几乎不用 NSthread OC 程序员自行管理 偶尔使用 GCD C 自动管理 经常使用 NSOpe ...