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多线程编程(一):threading模块综述
Apr 05 Python
Python基于smtplib实现异步发送邮件服务
May 28 Python
通过数据库向Django模型添加字段的示例
Jul 21 Python
python实现应用程序在右键菜单中添加打开方式功能
Jan 09 Python
在Windows中设置Python环境变量的实例讲解
Apr 28 Python
Python+OpenCV图片局部区域像素值处理改进版详解
Jan 23 Python
解决Python selenium get页面很慢时的问题
Jan 30 Python
pycharm new project变成灰色的解决方法
Jun 27 Python
python多线程实现代码(模拟银行服务操作流程)
Jan 13 Python
Python字符串中删除特定字符的方法
Jan 15 Python
Windows+Anaconda3+PyTorch+PyCharm的安装教程图文详解
Apr 03 Python
详解使用scrapy进行模拟登陆三种方式
Feb 21 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
php5.2.0内存管理改进
2007/01/22 PHP
php+mysql+ajax实现单表多字段多关键词查询的方法
2017/04/15 PHP
JavaScript this调用规则说明
2010/03/08 Javascript
基于jQuery实现点击同时更改两个iframe的网址
2010/07/01 Javascript
解析Javascript中大括号“{}”的多义性
2013/12/02 Javascript
JavaScript DOM事件(笔记)
2015/04/08 Javascript
JavaScript提高性能知识点汇总
2016/01/15 Javascript
jQuery操作Table技巧大汇总
2016/01/23 Javascript
浅谈jquery设置和获得checkbox选中的问题
2016/08/19 Javascript
手机端 HTML5使用photoswipe.js仿微信朋友圈图片放大效果
2016/08/25 Javascript
Angular 4.x+Ionic3踩坑之Ionic 3.x界面传值详解
2018/03/13 Javascript
vue实现密码显示与隐藏按钮的自定义组件功能
2019/04/23 Javascript
ES6中字符串的使用方法扩展
2019/06/04 Javascript
详解javascript中var与ES6规范中let、const区别与用法
2020/01/11 Javascript
Vue文本模糊匹配功能如何实现
2020/07/30 Javascript
如何编写一个 Webpack Loader的实现
2020/10/18 Javascript
通过实例了解Render Props回调地狱解决方案
2020/11/04 Javascript
python3编码问题汇总
2016/09/06 Python
Pyhton中单行和多行注释的使用方法及规范
2016/10/11 Python
Python处理PDF及生成多层PDF实例代码
2017/04/24 Python
Python使用回溯法子集树模板解决爬楼梯问题示例
2017/09/08 Python
Python 结巴分词实现关键词抽取分析
2017/10/21 Python
超简单使用Python换脸实例
2019/03/27 Python
pyqt5 删除layout中的所有widget方法
2019/06/25 Python
python中update的基本使用方法详解
2019/07/17 Python
python 经典数字滤波实例
2019/12/16 Python
浅谈keras中的后端backend及其相关函数(K.prod,K.cast)
2020/06/29 Python
Python监听剪切板实现方法代码实例
2020/11/11 Python
CSS3中使用RGBa来调节透明度的教程
2016/05/09 HTML / CSS
html5 canvas绘制放射性渐变色效果
2018/01/04 HTML / CSS
小学语文教学反思
2014/02/10 职场文书
党员岗位承诺口号大全
2014/03/28 职场文书
考生诚信考试承诺书
2014/05/23 职场文书
2014年征兵标语
2014/06/20 职场文书
生物工程专业求职信
2014/09/03 职场文书
4种方法python批量修改替换列表中元素
2022/04/07 Python