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获取文件ssdeep值的方法
Oct 05 Python
python每隔N秒运行指定函数的方法
Mar 16 Python
讲解Python中运算符使用时的优先级
May 14 Python
Python实现压缩和解压缩ZIP文件的方法分析
Sep 28 Python
windows下Virtualenvwrapper安装教程
Dec 13 Python
python3库numpy数组属性的查看方法
Apr 17 Python
对python numpy数组中冒号的使用方法详解
Apr 17 Python
用pandas中的DataFrame时选取行或列的方法
Jul 11 Python
用Pelican搭建一个极简静态博客系统过程解析
Aug 22 Python
详解Django中异步任务之django-celery
Nov 05 Python
Python 里最强的地图绘制神器
Mar 01 Python
python之np.argmax()及对axis=0或者1的理解
Jun 02 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中使用Oracle数据库(1)
2006/10/09 PHP
基于PHP实现用户注册登录功能
2016/10/14 PHP
如何利用预加载优化Laravel Model查询详解
2017/08/11 PHP
PHP+iframe模拟Ajax上传文件功能示例
2019/07/02 PHP
Javascript之旅 对象的原型链之由来
2010/08/25 Javascript
jQuery.extend 函数的详细用法
2012/06/27 Javascript
使用GruntJS构建Web程序之合并压缩篇
2014/06/06 Javascript
js使用split函数按照多个字符对字符串进行分割的方法
2015/03/20 Javascript
jquery使用each方法遍历json格式数据实例
2015/05/18 Javascript
Jquery中基本选择器用法实例详解
2015/05/18 Javascript
jquery.fastLiveFilter.js实现输入自动过滤的方法
2015/08/11 Javascript
Jquery幻灯片特效代码分享--鼠标点击按钮时切换(1)
2015/08/15 Javascript
基于jQuery实现的单行公告活动轮播效果
2017/08/23 jQuery
JavaScript正则表达式的贪婪匹配和非贪婪匹配
2017/09/05 Javascript
基于原生js运动方式关键点的总结(推荐)
2017/10/01 Javascript
浅谈vue-router2路由参数注意的问题
2017/11/08 Javascript
使用淘宝镜像cnpm安装Vue.js的图文教程
2018/05/17 Javascript
深入浅析js原型链和vue构造函数
2018/10/25 Javascript
layer设置maxWidth及maxHeight解决方案
2019/07/26 Javascript
js加减乘除精确运算方法实例代码
2021/01/17 Javascript
python list使用示例 list中找连续的数字
2014/01/27 Python
给Python入门者的一些编程建议
2015/06/15 Python
Python paramiko模块的使用示例
2018/04/11 Python
Python发送邮件功能示例【使用QQ邮箱】
2018/12/04 Python
python使用pipeline批量读写redis的方法
2019/02/18 Python
Windows下Anaconda和PyCharm的安装与使用详解
2020/04/23 Python
Python学习之time模块的基本使用
2021/01/17 Python
图片上传插件ImgUploadJS:用HTML5 File API 实现截图粘贴上传、拖拽上传
2016/01/20 HTML / CSS
CAT鞋加拿大官网:CAT Footwear加拿大
2020/08/05 全球购物
澳洲最大的时尚奢侈品电商平台:Cettire
2020/06/15 全球购物
荷兰睡眠专家:Beter Bed
2020/11/23 全球购物
同学会邀请函模板
2015/01/30 职场文书
无婚姻登记记录证明
2015/06/18 职场文书
2015年环境监察工作总结
2015/07/23 职场文书
少儿励志名言(80句)
2019/08/14 职场文书
java中用float时,数字后面加f,这样是为什么你知道吗
2021/09/04 Java/Android