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中django框架通过正则搜索页面上email地址的方法
Mar 21 Python
python决策树之CART分类回归树详解
Dec 20 Python
Selenium 模拟浏览器动态加载页面的实现方法
May 16 Python
python中单下划线_的常见用法总结
Jul 10 Python
使用python将图片格式转换为ico格式的示例
Oct 22 Python
Python字符串匹配之6种方法的使用详解
Apr 08 Python
Python模块汇总(常用第三方库)
Oct 07 Python
keras 自定义loss损失函数,sample在loss上的加权和metric详解
May 23 Python
win10下python3.8的PIL库安装过程
Jun 08 Python
详解pandas.DataFrame.plot() 画图函数
Jun 14 Python
python mongo 向数据中的数组类型新增数据操作
Dec 05 Python
python绘制云雨图raincloud plot
Aug 05 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
php面向对象全攻略 (九)访问类型
2009/09/30 PHP
CI使用Tank Auth转移数据库导致密码用户错误的解决办法
2014/06/12 PHP
静态html文件执行php语句的方法(推荐)
2016/11/21 PHP
PHP操作redis实现的分页列表,新增,删除功能封装类与用法示例
2018/08/04 PHP
PHP实现的只保留字符串首尾字符功能示例【隐藏部分字符串】
2019/03/11 PHP
12款经典的白富美型—jquery图片轮播插件—前端开发必备
2013/01/08 Javascript
用模版生成HTML的的框架jquery.tmpl使用详解
2015/01/07 Javascript
jQuery实现美观的多级动画效果菜单代码
2015/09/06 Javascript
学习JavaScript设计模式之迭代器模式
2016/01/19 Javascript
深入理解$.each和$(selector).each
2016/05/15 Javascript
JavaScript 对象详细整理总结
2016/09/29 Javascript
jQuery插件FusionCharts绘制的3D双柱状图效果示例【附demo源码】
2017/04/20 jQuery
jQuery除指定区域外点击任何地方隐藏DIV功能
2017/11/13 jQuery
NodeJs搭建本地服务器之使用手机访问的实例讲解
2018/05/12 NodeJs
vue里input根据value改变背景色的实例
2018/09/29 Javascript
layui table数据修改的回显方法
2019/09/04 Javascript
javaScript把其它类型转换为Number类型
2019/10/13 Javascript
Vue中多元素过渡特效的解决方案
2020/02/05 Javascript
Vue解决移动端弹窗滚动穿透问题
2020/12/15 Vue.js
[01:36:57]【09DOTA2第一视角】小骷髅
2014/04/16 DOTA
python的Template使用指南
2014/09/11 Python
Python中的高级数据结构详解
2015/03/27 Python
Pycharm远程调试openstack的方法
2017/11/21 Python
python 中pyqt5 树节点点击实现多窗口切换问题
2019/07/04 Python
Python 3.6 中使用pdfminer解析pdf文件的实现
2019/09/25 Python
tensorflow -gpu安装方法(不用自己装cuda,cdnn)
2020/01/20 Python
Python3+Flask安装使用教程详解
2021/02/16 Python
美国领先的家居装饰和礼品商店:Kirkland’s
2017/01/30 全球购物
财务总监管理职责范文
2014/03/09 职场文书
公司人事专员岗位职责
2014/08/11 职场文书
法人代表证明书范本
2015/06/18 职场文书
格列夫游记读书笔记
2015/07/01 职场文书
2016班级元旦联欢会开幕词
2016/03/04 职场文书
如何书写邀请函?
2019/06/24 职场文书
如何使用pdb进行Python调试
2021/06/30 Python
Mysql数据库group by原理详解
2022/07/07 MySQL