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 相关文章推荐
解读Django框架中的低层次缓存API
Jul 24 Python
深入了解Python数据类型之列表
Jun 24 Python
详解使用 pyenv 管理多个版本 python 环境
Oct 19 Python
Python查找第n个子串的技巧分享
Jun 27 Python
python3.6下Numpy库下载与安装图文教程
Apr 02 Python
python实现在函数中修改变量值的方法
Jul 16 Python
Tornado实现多进程/多线程的HTTP服务详解
Jul 25 Python
python3发送邮件需要经过代理服务器的示例代码
Jul 25 Python
Django中密码的加密、验密、解密操作
Dec 19 Python
python中绕过反爬虫的方法总结
Nov 25 Python
Python实现FTP文件定时自动下载的步骤
Dec 19 Python
python爬取网页版QQ空间,生成各类图表
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中判断一个字符串包含另一个字符串的方法
2007/03/19 PHP
phpstrom使用xdebug配置方法
2013/12/17 PHP
Laravel中log无法写入问题的解决
2017/06/17 PHP
Smarty模板变量与调节器实例详解
2019/07/20 PHP
List Information About the Binary Files Used by an Application
2007/06/11 Javascript
javascript使用输出语句实现网页特效代码
2015/08/06 Javascript
7个去伪存真的JavaScript面试题
2016/01/07 Javascript
基于javascript实现图片切换效果
2016/04/17 Javascript
js鼠标按键事件和键盘按键事件用法实例汇总
2016/10/03 Javascript
详解nodejs 文本操作模块-fs模块(一)
2016/12/22 NodeJs
vue拦截器Vue.http.interceptors.push使用详解
2017/04/22 Javascript
socket.io学习教程之基本应用(二)
2017/04/29 Javascript
JS同步、异步、延迟加载的方法
2018/05/05 Javascript
ng-alain表单使用方式详解
2018/07/10 Javascript
解决Angular4项目部署到服务器上刷新404的问题
2018/08/31 Javascript
mapboxgl实现带箭头轨迹线的代码
2021/01/04 Javascript
python使用cookielib库示例分享
2014/03/03 Python
使用Python操作MySQL的一些基本方法
2015/08/16 Python
用python结合jieba和wordcloud实现词云效果
2017/09/05 Python
Python简单过滤字母和数字的方法小结
2019/01/09 Python
Python字符串对象实现原理详解
2019/07/01 Python
浅谈Python 函数式编程
2020/06/20 Python
Python操作MySQL数据库的示例代码
2020/07/13 Python
用html5实现语音搜索框的方法
2014/03/18 HTML / CSS
英国舒适型鞋履品牌:FitFlop
2017/05/17 全球购物
复古服装:RetroStage
2019/05/10 全球购物
桥梁与隧道工程专业本科生求职信
2013/10/08 职场文书
军校本科大学生自我评价
2014/01/14 职场文书
市委常委会班子党的群众路线教育实践活动整改方案
2014/10/25 职场文书
先进个人材料怎么写
2014/12/30 职场文书
环保守法证明
2015/06/24 职场文书
2016年大学迎新工作总结
2015/10/14 职场文书
母婴行业实体、电商模式全面解析
2019/08/01 职场文书
Python实现随机生成迷宫并自动寻路
2021/06/13 Python
世界十大儿童漫画书排名,法国国宝漫画排第五,第二是轰动日本连环
2022/03/18 欧美动漫
Redis实现主从复制方式(Master&Slave)
2022/06/21 Redis