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之入门(四)运算
May 27 Python
python通过pil模块获得图片exif信息的方法
Mar 16 Python
Python迭代器和生成器定义与用法示例
Feb 10 Python
分析Python读取文件时的路径问题
Feb 11 Python
TensorFlow变量管理详解
Mar 10 Python
Django读取Mysql数据并显示在前端的实例
May 27 Python
Pytorch DataLoader 变长数据处理方式
Jan 08 Python
解决pytorch DataLoader num_workers出现的问题
Jan 14 Python
Python3实现mysql连接和数据框的形成(实例代码)
Jan 17 Python
python第三方网页解析器 lxml 扩展库与 xpath 的使用方法
Apr 06 Python
Django一小时写出账号密码管理系统
Apr 29 Python
python中的random模块和相关函数详解
Apr 22 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
Laravel中的chunk组块结果集处理与注意问题
2018/08/15 PHP
在IE下获取object(ActiveX)的Param的代码
2009/09/15 Javascript
复制js对象方法(详解)
2013/07/08 Javascript
js动态创建、删除表格示例代码
2013/08/07 Javascript
js 窗口抖动示例
2013/09/04 Javascript
JQuery插件开发示例代码
2013/11/06 Javascript
jQuery 无刷新分页实例代码
2013/11/12 Javascript
bootstrap data与jquery .data
2014/07/07 Javascript
JS中对象与字符串的互相转换详解
2016/05/20 Javascript
js剪切板应用clipboardData实例解析
2016/05/29 Javascript
jQuery绑定自定义事件的魔法升级版
2016/06/30 Javascript
javaScript生成支持中文带logo的二维码(jquery.qrcode.js)
2017/01/03 Javascript
对象不支持indexOf属性或方法的解决方法(必看)
2017/05/28 Javascript
jQuery图片缩放插件smartZoom使用实例详解
2017/08/25 jQuery
js中split()方法得到的数组长度问题
2018/07/19 Javascript
解决Vue中引入swiper,在数据渲染的时候,发生不滑动的问题
2018/09/27 Javascript
[00:50]深扒TI7聊天轮盘语音出处6
2017/05/11 DOTA
matplotlib.pyplot绘图显示控制方法
2019/01/15 Python
基于python生成器封装的协程类
2019/03/20 Python
python 读取串口数据的示例
2020/11/09 Python
详解python使用金山词霸的翻译功能(调试工具断点的使用)
2021/01/07 Python
德国高尔夫商店:Golfshop.de
2019/06/22 全球购物
美国传奇滑手Paul Rodriguez创办的街头滑板品牌:Primitive Skateboarding
2019/10/29 全球购物
Java基础知识面试要点
2016/07/29 面试题
历史学专业大学生找工作的自我评价
2013/10/16 职场文书
机关出纳岗位职责
2014/04/03 职场文书
计划生育工作总结2015
2015/04/03 职场文书
幼儿园新学期开学寄语
2015/05/27 职场文书
2015年公司中秋节致辞
2015/07/31 职场文书
课文《燕子》教学反思
2016/02/17 职场文书
创业计划书之冷饮店
2019/09/27 职场文书
Python如何把不同类型数据的json序列化
2021/04/30 Python
Nebula Graph解决风控业务实践
2022/03/31 MySQL
Win11软件图标固定到任务栏
2022/04/19 数码科技
MySQL sql模式设置引起的问题
2022/05/15 MySQL
Java实现HTML转为Word的示例代码
2022/06/28 Java/Android