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的webrtc库实现语音端点检测
May 31 Python
Python探索之修改Python搜索路径
Oct 25 Python
python+matplotlib实现礼盒柱状图实例代码
Jan 16 Python
Flask解决跨域的问题示例代码
Feb 12 Python
Python自定义函数实现求两个数最大公约数、最小公倍数示例
May 21 Python
使用Selenium破解新浪微博的四宫格验证码
Oct 19 Python
一篇文章彻底搞懂Python中可迭代(Iterable)、迭代器(Iterator)与生成器(Generator)的概念
May 13 Python
pyQt5实时刷新界面的示例
Jun 25 Python
python kafka 多线程消费者&amp;手动提交实例
Dec 21 Python
pytorch判断是否cuda 判断变量类型方式
Jun 23 Python
python批量更改目录名/文件名的方法
Apr 18 Python
PyTorch 如何设置随机数种子使结果可复现
May 12 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 5.0对象模型深度探索之属性和方法
2008/03/27 PHP
php5 图片验证码实现代码
2009/12/11 PHP
yii2控制器Controller Ajax操作示例
2016/07/23 PHP
PHP设计模式之工厂模式定义与用法详解
2018/04/03 PHP
jquery插件jbox使用iframe关闭问题
2009/02/09 Javascript
JavaScript设计模式之策略模式实例
2014/10/10 Javascript
jquery中filter方法用法实例分析
2015/02/06 Javascript
深入理解JavaScript系列(48):对象创建模式(下篇)
2015/03/04 Javascript
JavaScript黑洞数字之运算路线查找算法(递归算法)实例
2016/01/28 Javascript
AngularJS教程之环境设置
2016/08/16 Javascript
javascript设置文本框光标的方法实例小结
2016/11/04 Javascript
详解Vue2中组件间通信的解决全方案
2017/07/28 Javascript
VueJs组件prop验证简单介绍
2017/09/12 Javascript
小程序实现单选多选功能
2018/11/04 Javascript
Vue.js项目实战之多语种网站的功能实现(租车)
2019/08/07 Javascript
[01:01:51]EG vs VG Supermajor小组赛B组 BO3 第二场 6.2
2018/06/03 DOTA
Python 专题五 列表基础知识(二维list排序、获取下标和处理txt文本实例)
2017/03/20 Python
python中的文件打开与关闭操作命令介绍
2018/04/26 Python
python自动发送测试报告邮件功能的实现
2019/01/22 Python
python random从集合中随机选择元素的方法
2019/01/23 Python
Python pip 安装与使用(安装、更新、删除)
2019/10/06 Python
Pytorch .pth权重文件的使用解析
2020/02/14 Python
基于Python爬取爱奇艺资源过程解析
2020/03/02 Python
关于多种方式完美解决Python pip命令下载第三方库的问题
2020/12/21 Python
css背景图片的背景裁切、背景透明度、背景变换等效果运用
2012/12/24 HTML / CSS
html5的localstorage详解
2017/05/09 HTML / CSS
详解HTML5中的元素与元素
2015/08/17 HTML / CSS
美国现代家具和家居商店:Apt2B
2016/08/29 全球购物
毕业自我鉴定怎么写
2014/03/25 职场文书
12.4全国法制宣传日活动总结
2014/11/01 职场文书
2014年幼儿园小班工作总结
2014/12/04 职场文书
现实表现材料范文
2014/12/23 职场文书
出纳工作检讨书范文
2014/12/27 职场文书
委托书英文
2015/01/28 职场文书
2015年出纳工作总结与计划
2015/05/18 职场文书
MySQL中int (10) 和 int (11) 的区别
2022/01/22 MySQL