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中使用元类的教程
Apr 28 Python
使用Pyinstaller的最新踩坑实战记录
Nov 08 Python
pandas Dataframe行列读取的实例
Jun 08 Python
Python中的集合介绍
Jan 28 Python
Python获取网段内ping通IP的方法
Jan 31 Python
详解python算法之冒泡排序
Mar 05 Python
Python3.5 Pandas模块之Series用法实例分析
Apr 23 Python
python matplotlib库绘制散点图例题解析
Aug 10 Python
详解python列表(list)的使用技巧及高级操作
Aug 15 Python
Python3的socket使用方法详解
Feb 18 Python
python自动打开浏览器下载zip并提取内容写入excel
Jan 04 Python
matplotlib常见函数之plt.rcParams、matshow的使用(坐标轴设置)
Jan 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中文件上传的安全问题
2006/10/09 PHP
ThinkPHP 3.2 数据分页代码分享
2014/10/14 PHP
深入理解php printf() 输出格式化的字符串
2016/05/23 PHP
关于__defineGetter__ 和__defineSetter__的说明
2007/05/12 Javascript
JavaScript 浮点数运算 精度问题
2009/10/06 Javascript
ExtJS Window 最小化的一种方法
2009/11/18 Javascript
调整小数的格式保留小数点后两位
2014/05/14 Javascript
jquery 实现两Select 标签项互调示例代码
2014/09/25 Javascript
AngularJS通过$sce输出html的方法
2016/09/22 Javascript
Bootstrap Navbar Component实现响应式导航
2016/10/08 Javascript
JavaScript中绑定事件的三种方式及去除绑定
2016/11/05 Javascript
vue2的todolist入门小项目的详细解析
2017/05/11 Javascript
JS实现微信里判断页面是否被分享成功的方法
2017/06/06 Javascript
Node.JS 循环递归复制文件夹目录及其子文件夹下的所有文件
2017/09/18 Javascript
基于Vue2.0+ElementUI实现表格翻页功能
2017/10/23 Javascript
微信小程序使用slider设置数据值及switch开关组件功能【附源码下载】
2017/12/09 Javascript
使用Vue的slot插槽分发父组件内容实现高度复用、更加灵活的组件(推荐)
2018/05/01 Javascript
浅析Vue 生命周期
2018/06/21 Javascript
[05:59]2018DOTA2国际邀请赛寻真——只为胜利的Secret
2018/08/13 DOTA
python 字典中文key处理,读取,比较方法
2018/07/06 Python
python实现排序算法解析
2018/09/08 Python
python 从文件夹抽取图片另存的方法
2018/12/04 Python
Python线上环境使用日志的及配置文件
2019/07/28 Python
Pycharm使用远程linux服务器conda/python环境在本地运行的方法(图解))
2019/12/09 Python
PyTorch 普通卷积和空洞卷积实例
2020/01/07 Python
Selenium基于PIL实现拼接滚动截图
2020/04/10 Python
Python 如何定义匿名或内联函数
2020/08/01 Python
Html5新标签解释及用法
2012/02/17 HTML / CSS
印尼披萨外送专家:Domino’s Pizza印尼
2017/12/28 全球购物
如何填写个人简历自我评价
2013/12/10 职场文书
《东方明珠》教学反思
2014/04/20 职场文书
歌颂祖国的演讲稿
2014/05/04 职场文书
文明礼貌演讲稿
2014/05/12 职场文书
房地产活动策划方案
2014/05/14 职场文书
群众路线教育实践活动整改落实情况汇报
2014/10/28 职场文书
交通事故被告代理词
2015/05/23 职场文书