Python中正则匹配使用findall,捕获分组(xxx)和非捕获分组(?:xxx)的差异
转自:https://blog.csdn.net/qq_42739440/article/details/81117919
下面是我在用findall匹配字符串时遇到的一个坑,分享出来供大家跳坑。
例题:
如图所示: 正则a和正则b两个式子匹配出来的结果是不同的。
那 ?:
的作用就是把捕获分组转变为非捕获分组。
什么是捕获组和非捕获组呢?
(qq|163|126) ---> 这样单独的括号就为捕获组
(?:qq|163|126) ---> 这样在原有分组里加上?:
就把捕获组转变为一个非捕获组
findall函数的源码解析
在这里面大家可以看一下findall函数的源码解析,用help(re.findall)
查看,得到如下翻译:
白话理解:
findall函数,就是说在正则匹配里,如果有分组,就仅仅匹配分组里面的内容,然后返回这个组的列表; 如果有多个分组,那就把每一个分组看成一个单位,组合为一个元组,然后返回一个含有多个元组的列表。
例题解答:
区别了捕获组和非捕获组后,上面开头例题中匹配邮箱的问题就迎刃而解了。
正则a的式子:r"\w+@(qq|163|126).com" 是匹配了捕获组,所以得到了['qq', '163', '126'] 这个列表;
正则b的式子: r"\w+@(?:qq|163|126).com" ,?: 把捕获组转变为一个非捕获组,使得这个式子可以从头到尾全部匹配,所以成功得到了 ['123@qq.com', 'aaa@163.com', 'bbb@126.com'] 这个邮箱列表。
Python中正则匹配使用findall,捕获分组(xxx)和非捕获分组(?:xxx)的差异的更多相关文章
- Python中正则匹配使用findall时的注意事项
在使用正则搜索内容时遇到一个小坑,百度搜了一下,遇到这个坑的还不少,特此记录一下. 比如说有一个字符串 "123@qq.comaaa@163.combbb@126.comasdf111@a ...
- python中正则匹配之re模块
Python中正则表达式 re:re是提供正则表达式匹配操作的模块 一.什么是正则表达式 正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某个模式匹配,Python 自1.5版本起 ...
- python - 手机号正则匹配
Python 手机号正则匹配 # -*- coding:utf-8 -*- import re def is_phone(phone): phone_pat = re.compile('^(13\d| ...
- JavaScript正则表达式模式匹配(4)——使用exec返回数组、捕获性分组和非捕获性分组、嵌套分组
使用exec返回数组 var pattern=/^[a-z]+\s[0-9]{4}$/; var str='google 2012'; alert(pattern.exec(str)); //返回一个 ...
- Python中正则模块re.compile、re.match及re.search函数用法
import rehelp(re.compile)'''输出结果为:Help on function compile in module re: compile(pattern, flags=0) C ...
- python - re正则匹配模块
re模块 re 模块使 Python 语言拥有全部的正则表达式功能. compile 函数根据一个模式字符串和可选的标志参数生成一个正则表达式对象.该对象拥有一系列方法用于正则表达式匹配和替换. re ...
- 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 ...
- JS中正则匹配的三个方法match exec test的用法
javascript中正则匹配有3个方法,match,exec,test: match是字符串的一个方法,接收一个RegExp对象做为参数: match() 方法可在字符串内检索指定的值,或找到一个或 ...
随机推荐
- [转帖]使用TOAD优化复杂SQL
独家秘笈!看下如何一键优化Oracle数据库复杂sql,DBA必备 https://www.toutiao.com/i6741208493644055053/ 原来toad 还有这种功能 感觉类似于 ...
- java积累的细节问题
一.将几个数字进行拼接,拼接成字符串 一定要将""放到几个数字之前,否则就会把数字相加之后的数转化成字符串 如你需要拼接年份,月份,和日 如果:2018+12+13+"& ...
- java poi3.10.1基本excel使用
效果: 代码: //时间 String checkTime = "yyyy/MM/dd"; //人员查询 Set preParticipantNames = new HashSet ...
- 某 游戏公司 php 面试题
1.实现未知宽高元素的水平垂直居中,至少两种方法. <div, class="father"> <div class="son">< ...
- SQL概要与表的创建
SQL概要与表的创建 1.表的结构 关系数据库通过类似Excel 工作表那样的.由行和列组成的二维表来管理数据.用来管理数据的二维表在关系数据库中简称为表. 根据SQL 语句的内容返回的数据同 ...
- nginx如何调用PHP(nginx+php运行原理)
采用nginx+php作为webserver的架构模式,在现如今运用相当广泛.然而第一步需要实现的是如何让nginx正确的调用php.由于nginx调用php并不是如同调用一个静态文件那么直接简单,是 ...
- Thread 如何安全结束一个线程 MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
- Warning: popen() has been disabled for security reasons in OS/Guess.php on line 241
今天使用pecl install swoole命令编译安装swoole的时候提示:Warning: popen() has been disabled for security reasons in ...
- Asp.Net Core Linux环境下 找不到配置文件、静态文件的问题
直接发布会找不到配置文件,和静态文件.需要先cd到项目文件夹,然后在发布.
- centOS 7单机安装 kong
kong 网关 单机部署 环境:centOS 7:依赖:jdk1.8 安装内容:postgresql数据库, kong 网关,nodeJs和npm,kong Dashboard (可视化管理界面) 版 ...