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 相关文章推荐
17个Python小技巧分享
Jan 23 Python
python实现的简单窗口倒计时界面实例
May 05 Python
python复制文件的方法实例详解
May 22 Python
深入理解python中的闭包和装饰器
Jun 12 Python
常见python正则用法的简单实例
Jun 21 Python
使用python将大量数据导出到Excel中的小技巧分享
Jun 14 Python
python leetcode 字符串相乘实例详解
Sep 03 Python
Django基础知识 web框架的本质详解
Jul 18 Python
python Gunicorn服务器使用方法详解
Jul 22 Python
在win64上使用bypy进行百度网盘文件上传功能
Jan 02 Python
python GUI库图形界面开发之PyQt5树形结构控件QTreeWidget详细使用方法与实例
Mar 02 Python
python实现xlwt xlrd 指定条件给excel行添加颜色
Jul 14 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 5框架学习之用户认证
2015/04/09 PHP
PHP list() 将数组中的值赋给变量的简单实例
2016/06/13 PHP
thinkphp分页实现效果
2016/10/13 PHP
使用Codeigniter重写insert的方法(推荐)
2017/03/23 PHP
PHP 断点续传实例详解
2017/11/11 PHP
原生Js实现按的数据源均分时间点幻灯片效果(已封装)
2010/12/28 Javascript
asp.net网站开发中用jquery实现滚动浏览器滚动条加载数据(类似于腾讯微博)
2012/03/14 Javascript
jquery的ajax()函数传值中文乱码解决方法介绍
2012/11/08 Javascript
javascrip关于继承的小例子
2013/05/10 Javascript
js获取html页面节点方法(递归方式)
2013/12/13 Javascript
jQuery中:submit选择器用法实例
2015/01/03 Javascript
简单讲解AngularJS的Routing路由的定义与使用
2016/03/05 Javascript
JavaScript学习笔记之数组去重
2016/03/23 Javascript
深入理解jQuery之防止冒泡事件
2016/05/24 Javascript
Vue源码解读之Component组件注册的实现
2018/08/24 Javascript
webpack4 处理CSS的方法示例
2018/09/03 Javascript
angular的输入和输出的使用方法
2018/09/22 Javascript
Vue源码探究之虚拟节点的实现
2019/04/17 Javascript
vue+web端仿微信网页版聊天室功能
2019/04/30 Javascript
jQuery设置下拉框显示与隐藏效果的方法分析
2019/09/15 jQuery
微信小程序音乐播放器开发
2019/11/20 Javascript
Python读取word文本操作详解
2018/01/22 Python
python定向爬取淘宝商品价格
2018/02/27 Python
python实现对输入的密文加密
2019/03/20 Python
python实现在线翻译
2020/06/18 Python
python怎么删除缓存文件
2020/07/19 Python
用python写PDF转换器的实现
2020/10/29 Python
解决Pyinstaller打包软件失败的一个坑
2021/03/04 Python
html5 Canvas画图教程(8)—canvas里画曲线之bezierCurveTo方法
2013/01/09 HTML / CSS
Html5元素及基本语法详解
2016/08/02 HTML / CSS
世界领先的以旅馆为主的在线预订平台:Hostelworld
2016/10/09 全球购物
6号汽车旅馆预订:Motel 6
2018/02/11 全球购物
彪马荷兰官网:PUMA荷兰
2019/05/08 全球购物
党员自我剖析材料范文
2014/10/06 职场文书
写一个Python脚本下载哔哩哔哩舞蹈区的所有视频
2021/05/31 Python
Golang入门之计时器
2022/05/04 Golang