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的Scrapy框架编写web爬虫的简单示例
Apr 17 Python
横向对比分析Python解析XML的四种方式
Mar 30 Python
python+matplotlib演示电偶极子实例代码
Jan 12 Python
Python实现OpenCV的安装与使用示例
Mar 30 Python
python读取图片任意范围区域
Jan 23 Python
pandas DataFrame 行列索引及值的获取的方法
Jul 02 Python
python连接PostgreSQL数据库的过程详解
Sep 18 Python
Pandas时间序列重采样(resample)方法中closed、label的作用详解
Dec 10 Python
浅谈tensorflow中Dataset图片的批量读取及维度的操作详解
Jan 20 Python
Pycharm Git 设置方法
Sep 15 Python
python爬虫工具例举说明
Nov 30 Python
python接口测试返回数据为字典取值方式
Feb 12 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 强制下载文件代码
2010/10/24 PHP
yii框架源码分析之创建controller代码
2011/06/28 PHP
php笔记之:文章中图片处理的使用
2013/04/26 PHP
php的数组与字符串的转换函数整理汇总
2013/07/18 PHP
使用php语句将数据库*.sql文件导入数据库
2014/05/05 PHP
PHP数据库万能引擎类adodb配置使用以及实例集锦
2014/06/12 PHP
php基于GD库画五星红旗的方法
2015/02/24 PHP
Node.js编码规范
2014/07/14 Javascript
基于jQuery创建鼠标悬停效果的方法
2015/03/07 Javascript
jQuery采用连缀写法实现的折叠菜单效果
2015/09/18 Javascript
jQuery Ajax和getJSON获取后台普通json数据和层级json数据用法分析
2016/06/08 Javascript
Bootstrap编写一个兼容主流浏览器的受众门户式风格页面
2016/07/01 Javascript
封装的dialog插件 基于bootstrap模态对话框的简单扩展
2016/08/10 Javascript
深入浅析jQuery对象$.html
2016/08/22 Javascript
JS实现简单易用的手机端浮动窗口显示效果
2016/09/07 Javascript
JS动态遍历json中所有键值对的方法(不知道属性名的情况)
2016/12/28 Javascript
JavaScript实现的鼠标响应颜色渐变效果完整实例
2017/02/18 Javascript
利用Vue v-model实现一个自定义的表单组件
2017/04/27 Javascript
Vuex 入门教程
2018/01/10 Javascript
JavaScript对象的浅拷贝与深拷贝实例分析
2018/07/25 Javascript
nodejs一个简单的文件服务器的创建方法
2019/09/13 NodeJs
javascript实现异形滚动轮播
2019/11/28 Javascript
django简单的前后端分离的数据传输实例 axios
2020/05/18 Javascript
微信小程序实现日历小功能
2020/11/18 Javascript
python解析模块(ConfigParser)使用方法
2013/12/10 Python
Python排序搜索基本算法之堆排序实例详解
2017/12/08 Python
python画柱状图--不同颜色并显示数值的方法
2018/12/13 Python
python实现在线翻译功能
2020/03/03 Python
意大利时尚精品店:Nugnes 1920
2020/02/10 全球购物
新郎父亲婚宴答谢词
2014/01/11 职场文书
小学生秋游活动方案
2014/02/23 职场文书
企业后勤岗位职责
2014/02/28 职场文书
外贸专业求职信
2014/03/09 职场文书
竞选班干部演讲稿300字
2014/08/20 职场文书
高一英语教学反思
2016/03/03 职场文书
2016五四青年节活动总结范文
2016/04/06 职场文书