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脚本将文字转换为图片的实例分享
Aug 29 Python
图文讲解选择排序算法的原理及在Python中的实现
May 04 Python
python itchat实现微信好友头像拼接图的示例代码
Aug 14 Python
Python3 关于pycharm自动导入包快捷设置的方法
Jan 16 Python
对dataframe数据之间求补集的实例详解
Jan 30 Python
详解python函数的闭包问题(内部函数与外部函数详述)
May 17 Python
python将excel转换为csv的代码方法总结
Jul 03 Python
Python使用Socket实现简单聊天程序
Feb 28 Python
Python标准库shutil模块使用方法解析
Mar 10 Python
matplotlib事件处理基础(事件绑定、事件属性)
Feb 03 Python
python基于OpenCV模板匹配识别图片中的数字
Mar 31 Python
Python基础教程,Python入门教程(超详细)
Jun 24 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
《心理测量者3》剧场版动画预告
2020/03/02 日漫
PHP如何得到当前页和上一页的地址?
2006/11/27 PHP
header与缓冲区之间的深层次分析
2016/07/30 PHP
yii2中dropDownList实现二级和三级联动写法
2017/04/26 PHP
PHP 计算两个特别大的整数实例代码
2018/05/07 PHP
dreamweaver 安装Jquery智能提示
2011/04/02 Javascript
js确认删除对话框效果的示例代码
2014/02/20 Javascript
jQuery中:disabled选择器用法实例
2015/01/04 Javascript
JavaScript检测弹出窗口是否已经关闭的方法
2015/03/24 Javascript
JavaScript前端开发之实现二进制读写操作
2015/11/04 Javascript
深入浅析NodeJs并发异步的回调处理
2015/12/21 NodeJs
JavaScript第一篇之实现按钮全选、功能
2016/08/21 Javascript
详解AngularJs中$sce与$sceDelegate上下文转义服务
2016/09/21 Javascript
Bootstrap和Java分页实例第二篇
2016/12/23 Javascript
3分钟掌握常用的JS操作JSON方法总结
2017/04/25 Javascript
微信小程序实现给循环列表添加点击样式实例
2017/04/26 Javascript
使用Require.js封装原生js轮播图的实现代码
2017/06/15 Javascript
微信小程序实现获取自己所处位置的经纬度坐标功能示例
2017/11/30 Javascript
Vue组件之自定义事件的功能图解
2018/02/01 Javascript
JS实现table表格内针对某列内容进行即时搜索筛选功能
2018/05/11 Javascript
JS实现简易留言板特效
2019/12/23 Javascript
Javascript地址引用代码实例解析
2020/02/25 Javascript
electron踩坑之dialog中的callback解决
2020/10/06 Javascript
详解如何在Javascript中使用Object.freeze()
2020/10/18 Javascript
Python3之不使用第三方变量,实现交换两个变量的值
2019/06/26 Python
python频繁写入文件时提速的方法
2019/06/26 Python
python数值基础知识浅析
2019/11/19 Python
香港优质食材和美酒专门店:FoodWise
2017/09/01 全球购物
医学生实习自荐信
2013/10/01 职场文书
经典演讲稿范文
2013/12/30 职场文书
学生感冒英文请假条
2014/02/04 职场文书
《愚公移山》教学反思
2014/02/20 职场文书
丧事主持词大全
2014/04/02 职场文书
班级寄语大全
2014/04/10 职场文书
小学生读书笔记范文
2015/06/30 职场文书
Python开发之QT解决无边框界面拖动卡屏问题(附带源码)
2021/05/27 Python