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获取网页状态码示例
Mar 30 Python
python用来获得图片exif信息的库实例分析
Mar 16 Python
Python线程创建和终止实例代码
Jan 20 Python
python 判断参数为Nonetype类型或空的实例
Oct 30 Python
Python 导入文件过程图解
Oct 15 Python
Python使用py2neo操作图数据库neo4j的方法详解
Jan 13 Python
python应用Axes3D绘图(批量梯度下降算法)
Mar 25 Python
浅谈keras 模型用于预测时的注意事项
Jun 27 Python
Python引入多个模块及包的概念过程解析
Sep 21 Python
五种Python转义表示法
Nov 27 Python
python中numpy数组与list相互转换实例方法
Jan 29 Python
python文件目录操作之os模块
May 08 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
PHP4和PHP5共存于一系统
2006/11/17 PHP
PHP中使用sleep造成mysql读取失败的案例和解决方法
2014/08/21 PHP
对比PHP对MySQL的缓冲查询和无缓冲查询
2016/07/01 PHP
php排序算法实例分析
2016/10/17 PHP
PHP convert_cyr_string()函数讲解
2019/02/13 PHP
url 编码 js url传参中文乱码解决方案
2010/04/11 Javascript
JS验证身份证有效性示例
2013/10/11 Javascript
关闭浏览器窗口弹出提示框并且可以控制其失效
2014/04/15 Javascript
jquery过滤特殊字符',防sql注入的实现方法
2016/08/17 Javascript
浅谈javascript中的事件冒泡和事件捕获
2016/12/28 Javascript
Canvas实现放射线动画效果
2017/02/15 Javascript
Angular X中使用ngrx的方法详解(附源码)
2017/07/10 Javascript
Vue2.0基于vue-cli+webpack同级组件之间的通信教程(推荐)
2017/09/14 Javascript
webpack多入口文件页面打包配置详解
2018/01/09 Javascript
微信小程序三级联动选择器使用方法
2020/05/19 Javascript
基于Nodejs的Tcp封包和解包的理解
2018/09/19 NodeJs
JS实现拼图游戏
2021/01/29 Javascript
vue-video-player 解决微信自动全屏播放问题(横竖屏导致样式错乱问题)
2020/02/25 Javascript
[57:50]DOTA2上海特级锦标赛主赛事日 - 4 胜者组决赛Secret VS Liquid第二局
2016/03/05 DOTA
python del()函数用法
2013/03/24 Python
python实现sublime3的less编译插件示例
2014/04/27 Python
Python新手实现2048小游戏
2015/03/31 Python
详解python-图像处理(映射变换)
2019/03/22 Python
python web框架中实现原生分页
2019/09/08 Python
使用Python求解带约束的最优化问题详解
2020/02/11 Python
new_zeros() pytorch版本的转换方式
2020/02/18 Python
Linux安装Python3如何和系统自带的Python2并存
2020/07/23 Python
flask框架中的cookie和session使用
2021/01/31 Python
CSS3 translate导致字体模糊的实例代码
2019/08/30 HTML / CSS
利用CSS3实现文本框的清除按钮相关的一些效果
2015/06/23 HTML / CSS
毕业生就业推荐信范文
2013/12/01 职场文书
商务英语专业求职信
2014/06/26 职场文书
考博导师推荐信范文
2015/03/27 职场文书
MySQL命令行操作时的编码问题详解
2021/04/14 MySQL
Python 实现Mac 屏幕截图详解
2021/10/05 Python