Python正则表达式分组概念与用法详解


Posted in Python onJune 24, 2017

本文实例讲述了Python正则表达式分组概念与用法。分享给大家供大家参考,具体如下:

正则表达式分组

分组就是用一对圆括号“()”括起来的正则表达式,匹配出的内容就表示一个分组。从正则表达式的左边开始看,看到的第一个左括号“(”表示第一个分组,第二个表示第二个分组,依次类推,需要注意的是,有一个隐含的全局分组(就是0),就是整个正则表达式。

分完组以后,要想获得某个分组的内容,直接使用group(num)和groups()函数去直接提取就行。

例如:提取代码中的超链接中的文本

>>> s='<div><a href="https://support.google.com/chrome/?p=ui_hotword_search" rel="external nofollow" target="_blank">更多</a><p>dfsl</p></div>'
>>> print re.search(r'<a.*>(.*)</a>',s).group(1)
更多

或者

>>> print re.match(r'.*<a.*>(.*)</a>',s).group(1)
更多

按照上面的分组匹配以后,我们就可以拿到我们想拿到的字串,但是如果我们正则表达式中括号比较多,那我们在拿我们想要的字串时,要去挨个数我们想要的字串时第几个括号,这样会很麻烦,这个时候Python又引入了另一种分组,那就是命名分组,上面的叫无名分组。

命名分组

命名分组就是给具有默认分组编号的组另外再给一个别名。命名分组的语法格式如下:

(?P<name>正则表达式)#name是一个合法的标识符

如:提取字符串中的ip地址

>>> s = "ip='230.192.168.78',version='1.0.0'"
>>> re.search(r"ip='(?P<ip>\d+\.\d+\.\d+\.\d+).*", s)
>>> res.group('ip')#通过命名分组引用分组
'230.192.168.78'

后向引用

正则表达式中,放在圆括号“()”中的表示是一个组。然后你可以对整个组使用一些正则操作,例如重复操作符。
要注意的是,只有圆括号”()”才能用于形成组。”“用于定义字符集。”{}”用于定义重复操作。
当用”()”定义了一个正则表达式组后,正则引擎则会把被匹配的组按照顺序编号,存入缓存。这样我们想在后面对已经匹配过的内容进行引用时,就可以用”\数字”的方式或者是通过命名分组进行”(?P=name)“进行引用。\1表示引用第一个分组,\2引用第二个分组,以此类推,\n引用第n个组。而\0则引用整个被匹配的正则表达式本身。这些引用都必须是在正则表达式中才有效,用于匹配一些重复的字符串。
如:

#通过命名分组进行后向引用
>>> re.search(r'(?P<name>go)\s+(?P=name)\s+(?P=name)', 'go go go').group('name')
'go'
#通过默认分组编号进行后向引用
>>> re.search(r'(go)\s+\1\s+\1', 'go go go').group()
'go go go'

交换字符串的位置

>>> s = 'abc.xyz'
>>> re.sub(r'(.*)\.(.*)', r'\2.\1', s)
'xyz.abc'

前向肯定断言、后向肯定断言

前向肯定断言的语法:

(?=pattern)

后向肯定断言的语法:

(?<=pattern)

需要注意的是,如果在匹配的过程中,需要同时用到前向肯定断言和后向肯定断言,那么必须将后向肯定断言写在正则语句的前面,前向肯定断言写在正则语句的后面,表示后向肯定模式之后,前行肯定模式之前。
如:获取c语言代码中的注释内容

>>> s1='''char *a="hello world"; char b='c'; /* this is comment */ int c=1; /* t
his is multiline comment */'''
>>> re.findall( r'(?<=/\*).+?(?=\*/)' , s1 ,re.M|re.S)
[' this is comment ', ' this is multiline comment ']

(?<=/*)这个是后向肯定断言,表示“/*”之后。(?=*/)这个为前向肯定断言,表示“*/”之前,这两合并起来就是一个区间了,所以后向肯定断言放在前向肯定断言前面。

前向否定断言、后向否定断言

前向否定断言语法:

(?!pattern)

后向否定断言语法:

(?<!pattern)

前向否定和后向否定实例:

#提取不是.txt结尾的文件
>>> f1 = 'aaa.txt'
>>> re.findall(r'.*\..*$(?<!txt$)',f1)
[]
#提取不以数字开头的文件
>>> re.findall(r'^(?!\d+).*','1txt.txt')
[]
#提取不以数字开头不以py结尾的文件
>>> re.findall(r'^(?!\d+).+?\..*$(?<!py$)','test.py')
[]
>>> re.findall(r'^(?!\d+).+?\..*$(?<!py$)','test.txt')
['test.txt']
Python 相关文章推荐
Python实现数通设备端口使用情况监控实例
Jul 15 Python
举例讲解Python的lambda语句声明匿名函数的用法
Jul 01 Python
Python3操作SQL Server数据库(实例讲解)
Oct 21 Python
Python建立Map写Excel表实例解析
Jan 17 Python
python批量从es取数据的方法(文档数超过10000)
Dec 27 Python
Python 限制线程的最大数量的方法(Semaphore)
Feb 22 Python
Pandas_cum累积计算和rolling滚动计算的用法详解
Jul 04 Python
pybind11在Windows下的使用教程
Jul 04 Python
python3 实现函数写文件路径的正确方法
Nov 27 Python
如何在VSCode下使用Jupyter的教程详解
Jul 13 Python
Python正则re模块使用步骤及原理解析
Aug 18 Python
Python使用socket_TCP实现小文件下载功能
Oct 09 Python
Python正则表达式常用函数总结
Jun 24 #Python
Python实现好友全头像的拼接实例(推荐)
Jun 24 #Python
Python实现的爬虫功能代码
Jun 24 #Python
python3操作mysql数据库的方法
Jun 23 #Python
Python 中pandas.read_excel详细介绍
Jun 23 #Python
python3.4用函数操作mysql5.7数据库
Jun 23 #Python
Python实现树的先序、中序、后序排序算法示例
Jun 23 #Python
You might like
PHP自动更新新闻DIY
2006/10/09 PHP
php自动给文章加关键词链接的函数代码
2012/11/29 PHP
php中利用str_pad函数生成数字递增形式的产品编号
2013/09/30 PHP
php基于websocket搭建简易聊天室实践
2016/10/24 PHP
JQuery CSS样式控制 学习笔记
2009/07/23 Javascript
Javascript 二维数组
2009/11/26 Javascript
javascript与CSS复习(三)
2010/06/29 Javascript
jquery实现居中弹出层代码
2010/08/25 Javascript
javascript与webservice的通信实现代码
2010/12/25 Javascript
javascript获取当前日期时间及其它操作函数
2011/01/11 Javascript
angular.foreach 循环方法使用指南
2015/01/06 Javascript
举例讲解JavaScript中关于对象操作的相关知识
2015/11/16 Javascript
ajax实现动态下拉框示例
2017/01/10 Javascript
AngularJS监听路由变化的方法
2017/03/07 Javascript
使用SVG基本操作API的实例讲解
2017/09/14 Javascript
详解Angular路由之路由守卫
2018/05/10 Javascript
vue实现表单录入小案例
2019/09/27 Javascript
vuex的数据渲染与修改浅析
2020/11/26 Vue.js
[04:44]显微镜下的DOTA2第二期——你所没有注意到的细节
2014/06/20 DOTA
python网络编程学习笔记(八):XML生成与解析(DOM、ElementTree)
2014/06/09 Python
用python删除java文件头上版权信息的方法
2014/07/31 Python
Python设计模式之享元模式原理与用法实例分析
2019/01/11 Python
使用Python项目生成所有依赖包的清单方式
2020/07/13 Python
eDreams葡萄牙:全球最大的在线旅行社之一
2019/04/15 全球购物
美国摩托车头盔、零件、齿轮及配件商店:Cycle Gear
2019/06/12 全球购物
Quiksilver荷兰官方网站:冲浪和滑雪板
2019/11/16 全球购物
美国最大的在线生存商店:Survival Frog
2020/12/13 全球购物
《故乡》教学反思
2014/04/10 职场文书
幼儿园保育员岗位职责
2014/04/13 职场文书
动漫设计与制作专业推荐信
2014/07/07 职场文书
2014年市场部工作总结
2014/11/25 职场文书
优秀党员个人总结
2015/02/14 职场文书
2016公司年会主持词
2015/07/01 职场文书
《小小的船》教学反思
2016/02/18 职场文书
2016年保险公众宣传日活动总结
2016/04/05 职场文书
创业计划书之青年旅馆
2019/09/23 职场文书