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模块搜索概念介绍及模块安装方法介绍
Jun 03 Python
python中管道用法入门实例
Jun 04 Python
Python中max函数用法实例分析
Jul 17 Python
实例讲解python中的序列化知识点
Oct 08 Python
python requests post多层字典的方法
Dec 27 Python
Django REST framework内置路由用法
Jul 26 Python
python中bs4.BeautifulSoup的基本用法
Jul 27 Python
Django使用uwsgi部署时的配置以及django日志文件的处理方法
Aug 30 Python
python使用pandas抽样训练数据中某个类别实例
Feb 28 Python
python检查目录文件权限并修改目录文件权限的操作
Mar 11 Python
python和JavaScript哪个容易上手
Jun 23 Python
python析构函数用法及注意事项
Jun 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
Win2003+apache+PHP+SqlServer2008 配置生产环境
2014/07/29 PHP
php mongodb操作类 带几个简单的例子
2016/08/25 PHP
SOSO地图JS画出标注和中心点以html形式运行
2013/08/09 Javascript
extjs每个组件要设置唯一的ID否则会出错
2014/06/15 Javascript
浅析Node.js查找字符串功能
2014/09/03 Javascript
JavaScript实现的简单拖拽效果
2015/06/01 Javascript
使用AngularJS实现表单向导的方法
2015/06/19 Javascript
关于JS中的apply,call,bind的深入解析
2016/04/05 Javascript
Node.js中防止错误导致的进程阻塞的方法
2016/08/11 Javascript
Webpack执行命令参数详解
2017/06/17 Javascript
Javascript中将变量转换为字符串的三种方法
2017/09/19 Javascript
在vue里使用codemirror遇到的问题
2018/11/01 Javascript
优雅的在React项目中使用Redux的方法
2018/11/10 Javascript
Vue开发环境跨域访问问题
2020/01/22 Javascript
jquery实现手风琴案例
2020/05/04 jQuery
在vue项目中利用popstate处理页面返回的操作介绍
2020/08/06 Javascript
python实现获取序列中最小的几个元素
2014/09/25 Python
python的paramiko模块实现远程控制和传输示例
2017/10/13 Python
python如何创建TCP服务端和客户端
2018/08/26 Python
python实现转圈打印矩阵
2019/03/02 Python
python自动循环定时开关机(非重启)测试
2019/08/26 Python
Python 静态方法和类方法实例分析
2019/11/21 Python
pytorch 模拟关系拟合——回归实例
2020/01/14 Python
python随机模块random使用方法详解
2020/02/14 Python
Python ADF 单位根检验 如何查看结果的实现
2020/06/03 Python
Html5 postMessage实现跨域消息传递
2016/03/11 HTML / CSS
Linux上比较文件的命令都有哪些
2013/09/28 面试题
nohup的用法
2012/11/26 面试题
跳蚤市场口号
2014/06/13 职场文书
宣传标语大全
2014/07/01 职场文书
团队拓展活动方案
2014/08/28 职场文书
4S店收银员岗位职责
2015/04/07 职场文书
银行稽核岗位职责
2015/04/13 职场文书
幼儿园教师安全责任书
2015/05/08 职场文书
公司转让协议书
2016/03/19 职场文书
以下牛机,你有几个
2022/04/05 无线电