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 15 Python
编写Python CGI脚本的教程
Jun 29 Python
理解python正则表达式
Jan 15 Python
详解Python静态网页爬取获取高清壁纸
Apr 23 Python
django中上传图片分页三级联动效果的实现代码
Aug 30 Python
Python Print实现在输出中插入变量的例子
Dec 25 Python
解决Jupyter无法导入已安装的 module问题
Apr 17 Python
python list的index()和find()的实现
Nov 16 Python
cookies应对python反爬虫知识点详解
Nov 25 Python
python numpy中multiply与*及matul 的区别说明
May 26 Python
Python中的xlrd模块使用整理
Jun 15 Python
python数字图像处理之图像的批量处理
Jun 28 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
收音机怀古---春雷3P7图片欣赏
2021/03/02 无线电
目录,文件操作详谈―PHP
2006/11/25 PHP
php xhprof使用实例详解
2019/04/15 PHP
html5 canvas js(数字时钟)实例代码
2013/12/23 Javascript
js 鼠标移动显示图片的简单实例
2013/12/25 Javascript
js使用eval解析json实例与注意事项分享
2014/01/18 Javascript
使用正则表达式的格式化与高亮显示json字符串
2014/12/03 Javascript
jQuery插件ajaxfileupload.js实现上传文件
2020/10/23 Javascript
Bootstrap 附加导航(Affix)插件实例详解
2016/06/01 Javascript
什么是JavaScript注入攻击?
2016/09/14 Javascript
jquery购物车结算功能实现方法
2020/10/29 Javascript
jQuery为某个div加入行样式
2017/06/09 jQuery
ZeroClipboard.js使用一个flash复制多个文本框
2017/06/19 Javascript
React 高阶组件入门介绍
2018/01/11 Javascript
使用Vue实现移动端左滑删除效果附源码
2019/05/16 Javascript
vue下使用nginx刷新页面404的问题解决
2019/08/02 Javascript
基于JavaScript实现单例模式
2019/10/30 Javascript
Pandas的read_csv函数参数分析详解
2019/07/02 Python
django 多对多表的创建和插入代码实现
2019/09/09 Python
python爬虫 线程池创建并获取文件代码实例
2019/09/28 Python
python实现扫雷游戏
2020/03/03 Python
Pytorch数据拼接与拆分操作实现图解
2020/04/30 Python
Python grequests模块使用场景及代码实例
2020/08/10 Python
pycharm最新激活码有效期至2100年(亲测可用)
2021/02/05 Python
localStorage 设置过期时间的方法实现
2018/12/21 HTML / CSS
YOOX美国官方网站:全球著名的多品牌时尚网络概念店
2016/09/11 全球购物
澳大利亚票务和娱乐市场领导者:Ticketmaster
2017/03/03 全球购物
CHARLES & KEITH加拿大官网:新加坡时尚品牌
2020/03/26 全球购物
C++:memset ,memcpy和strcpy的根本区别
2013/04/27 面试题
Android面试题及答案
2015/09/04 面试题
表彰先进集体通报
2014/01/12 职场文书
幼教毕业生自我鉴定
2014/01/12 职场文书
超市开学活动方案
2014/03/01 职场文书
幼儿园安全责任书
2014/04/14 职场文书
关于十八大的演讲稿
2014/09/15 职场文书
2021年pycharm的最新安装教程及基本使用图文详解
2021/04/03 Python