Python正则表达式教程之二:捕获篇


Posted in Python onMarch 02, 2017

前言

在上一篇文中,我们介绍了关于Python正则表达式的基础,那么在这一篇文章里,我们将总结一下正则表达式关于捕获的用法。下面话不多说,来看看详细的介绍吧。   

捕获

捕获和分组在正则表达式中有着密切的联系,一般情况下,分组即捕获,都用小括号完成(因此,小括号在正则表达式中也属于特殊字符,表达原含义时需要转义): 

      (…)     正常分组,并捕获

      (?:…)   分组,但是不捕获 

举个例子,假设我们需要匹配一个座机号码:

>>> m = re.search(r'^(\d{3,4}-)?(\d{7,8})$','020-82228888')
>>> m.group(0)
'020-82228888'
>>> m.group(1)
'020-'
>>> m.group(2)
'82228888'

这里,默认分组(0)是完整的匹配,之后的分组则按出现顺序排列。 

接下来,我们想在一整段文本中,找出所有的座机号码,这里需要用到re.findall:

>>> re.findall(r'(\d{3,4}-)?(\d{7,8})','020-82228888\n0357-4227865') 
[('020-', '82228888'), ('0357-', '4227865')]

findall有一个特性,就是如果结果中有捕获的分组,则将捕获的分组组成tuple返回。利用这个特点,和上面提到的分组,但是不捕获的语法,可以得到我们想要的结果:

>>> re.findall(r'(?:\d{3,4}-)?\d{7,8}','020-82228888\n0357-4227865') 
['020-82228888', '0357-4227865']
>>> re.findall(r'(?:\d{3,4}-)?\d{7,8}','020-82228888\n4227865')  
['020-82228888', '4227865']

在正则表达式中,也可以通过\1,\2等来指代之前捕获的字符串组合。这个经常用于单双引号的正确匹配:

>>> sentence = """You said "why?" and I say "I don't know"."""
>>> re.findall(r'["\'](.*?)["\']', sentence)
['why?', 'I don']
>>> re.findall(r'(["\'])(.*?)\1', sentence)
[('"', 'why?'), ('"', "I don't know")]

此外,如果觉得\1,\2这种表示可读性不好的话,还可以给捕获起一个英文名字。如下例子中,实现了两种不同的日期格式之间的转换:

>>> sentence = "from 12/22/1629 to 11/14/1643"
>>> re.sub(r'(?P<month>\d{2})/(?P<day>\d{2})/(?P<year>\d{4})', r'\g<year>-\g<month>-\g<day>', sentence) 
'from 1629-12-22 to 1643-11-14'

但是,这种命名引用捕获的方式,在findall、search中却是无效的:

>>> sentence = """You said "why?" and I say "I don't know"."""
>>> re.findall(r'(?P<quote>["\'])(.*?)\g<quote>', sentence)  
[]
>>> re.search(r'(?P<quote>["\'])(.*?)\g<quote>', sentence)   
>>> re.search(r'(?P<quote>["\'])(.*?)\1', sentence)  
<_sre.SRE_Match object; span=(9, 15), match='"why?"'>
>>> re.search(r'(?P<quote>["\'])(.*?)\1', sentence).groupdict()
{'quote': '"'}

总结

以上就是Python正则表达式中关于分组捕获的全部内容了,希望本文的内容对大家的学习或者使用python能能带来一定的帮助,如果有疑问大家可以留言交流,如果有疑问大家可以留言交流。下一篇文章,我会继续总结一下正则表达式匹配时的贪婪/非贪婪特性。 请继续关注三水点靠木。

Python 相关文章推荐
Python写的Discuz7.2版faq.php注入漏洞工具
Aug 06 Python
Python的SQLAlchemy框架使用入门
Apr 29 Python
举例讲解Linux系统下Python调用系统Shell的方法
Nov 07 Python
Python的Scrapy爬虫框架简单学习笔记
Jan 20 Python
Django 浅谈根据配置生成SQL语句的问题
May 29 Python
Python 获取div标签中的文字实例
Dec 20 Python
python的pytest框架之命令行参数详解(上)
Jun 27 Python
python递归法实现简易连连看小游戏
Mar 25 Python
django如何自己创建一个中间件
Jul 24 Python
python模拟鼠标点击和键盘输入的操作
Aug 04 Python
Python基于内置函数type创建新类型
Oct 22 Python
python中数组和列表的简单实例
Mar 25 Python
Python正则表达式教程之一:基础篇
Mar 02 #Python
Python单例模式实例详解
Mar 01 #Python
python实现字典(dict)和字符串(string)的相互转换方法
Mar 01 #Python
python 截取 取出一部分的字符串方法
Mar 01 #Python
详解Python中的静态方法与类成员方法
Feb 28 #Python
python基于itchat实现微信群消息同步机器人
Feb 27 #Python
不要用强制方法杀掉python线程
Feb 26 #Python
You might like
锁定年轻人的双倍活力 星巴克推出星倍醇即饮浓咖啡
2021/03/03 咖啡文化
PHP中如何判断AJAX提交的数据
2012/02/05 PHP
php微信开发之自定义菜单完整流程
2016/10/08 PHP
基于thinkPHP类的插入数据库操作功能示例
2017/01/06 PHP
PHP实现的日历功能示例
2018/09/01 PHP
PHP经典设计模式之依赖注入定义与用法详解
2019/05/21 PHP
laravel 解决crontab不执行的问题
2019/10/22 PHP
JavaScript 图片预览效果 推荐
2009/12/22 Javascript
SWFObject 2.1以上版本语法介绍
2010/07/10 Javascript
javascript中length属性的探索
2011/07/31 Javascript
js 判断一个元素是否在页面中存在
2012/12/27 Javascript
基于JavaScript实现定时跳转到指定页面
2016/01/01 Javascript
JavaScript中对JSON对象的基本操作示例
2016/05/21 Javascript
Angularjs结合Bootstrap制作的一个TODO List
2016/08/18 Javascript
自己封装的一个简单的倒计时功能实例
2016/11/23 Javascript
vue.js项目打包上线的图文教程
2017/11/16 Javascript
Angular 组件之间的交互的示例代码
2018/03/24 Javascript
使用vue打包时vendor文件过大或者是app.js文件很大的问题
2018/06/29 Javascript
微信小程序template模板与component组件的区别和使用详解
2019/05/22 Javascript
小程序实现长按保存图片的方法
2019/12/31 Javascript
vue 内联样式style中的background用法说明
2020/08/05 Javascript
[01:20]DOTA2 齐天大圣至宝动态展示
2016/12/13 DOTA
python数据处理 根据颜色对图片进行分类的方法
2018/12/08 Python
Python实现Event回调机制的方法
2019/02/13 Python
python matplotlib库绘制散点图例题解析
2019/08/10 Python
win10安装tesserocr配置 Python使用tesserocr识别字母数字验证码
2020/01/16 Python
Pandas时间序列:时期(period)及其算术运算详解
2020/02/25 Python
Python虚拟环境的创建和包下载过程分析
2020/06/19 Python
css3中背景尺寸background-size详解
2014/09/02 HTML / CSS
幼儿园教学管理制度
2014/02/04 职场文书
行政专员的岗位职责
2014/03/10 职场文书
幼儿园大班家长评语
2014/04/17 职场文书
入职担保书怎么写
2014/05/12 职场文书
招标保密承诺书
2015/01/20 职场文书
525心理健康活动总结
2015/05/08 职场文书
勤俭节约主题班会
2015/08/13 职场文书