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调用windows api锁定计算机示例
Apr 17 Python
python使用pandas实现数据分割实例代码
Jan 25 Python
python书籍信息爬虫实例
Mar 19 Python
浅谈flask源码之请求过程
Jul 26 Python
Python 实现数据结构-堆栈和队列的操作方法
Jul 17 Python
python使用socket实现的传输demo示例【基于TCP协议】
Sep 24 Python
PyTorch实现重写/改写Dataset并载入Dataloader
Jul 14 Python
Django DRF认证组件流程实现原理详解
Aug 17 Python
django数据模型中null和blank的区别说明
Sep 02 Python
Python基于pillow库实现生成图片水印
Sep 14 Python
python中函数返回多个结果的实例方法
Dec 16 Python
Python爬虫入门教程02之笔趣阁小说爬取
Jan 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
用PHP将网址字符串转换成超链接(网址或email)
2010/05/25 PHP
php实现将上传word文件转为html的方法
2015/06/03 PHP
PHP实现的mysql操作类【MySQL与MySQLi方式】
2017/10/07 PHP
CI框架简单分页类用法示例
2020/06/06 PHP
JavaScript更改class和id的方法
2008/10/10 Javascript
Extjs学习笔记之六 面版
2010/01/08 Javascript
js 代码优化点滴记录
2012/02/19 Javascript
轻松创建nodejs服务器(1):一个简单nodejs服务器例子
2014/12/18 NodeJs
JS简单计算器实例
2015/01/20 Javascript
jQuery插件EnPlaceholder实现输入框提示文字
2015/06/05 Javascript
Javascript编写2048小游戏
2015/07/07 Javascript
基于jQuery实现多标签页切换的效果(web前端开发)
2016/07/24 Javascript
jQuery实现链接的title快速出现的方法
2017/02/20 Javascript
利用JavaScript如何查询某个值是否数组内
2017/07/30 Javascript
vue动态路由实现多级嵌套面包屑的思路与方法
2017/08/16 Javascript
Vue中用props给data赋初始值遇到的问题解决
2018/11/27 Javascript
浅谈KOA2 Restful方式路由初探
2019/03/14 Javascript
微信小程序登陆注册功能的实现代码
2019/12/10 Javascript
Vue3+elementui plus创建项目的方法
2020/12/01 Vue.js
python django集成cas验证系统
2014/07/14 Python
Python中关键字is与==的区别简述
2014/07/31 Python
Django中处理出错页面的方法
2015/07/15 Python
django2 快速安装指南分享
2018/01/05 Python
浅析Django 接收所有文件,前端展示文件(包括视频,文件,图片)ajax请求
2020/03/09 Python
python实现按键精灵找色点击功能教程,使用pywin32和Pillow库
2020/06/04 Python
CSS3+JavaScript实现炫酷呼吸效果的示例代码
2020/06/15 HTML / CSS
英国泽西岛植物:Jersey Plants Direct
2019/08/07 全球购物
意大利和国际最佳时尚品牌:Drestige
2019/12/28 全球购物
Java中有几种方法可以实现一个线程?用什么关键字修饰同步方法?stop()和suspend()方法为何不推荐使用?
2015/08/04 面试题
Java里面如何创建一个内部类的实例
2015/01/19 面试题
母亲七十大寿答谢词
2014/01/18 职场文书
个人收入证明模板
2014/09/18 职场文书
2014年管理人员工作总结
2014/12/01 职场文书
劳资员岗位职责
2015/02/13 职场文书
浅谈如何提高PHP代码质量之端到端集成测试
2021/05/28 PHP
Mysql索引失效 数据库表中有索引还是查询很慢
2022/05/15 MySQL