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程序与系统shell交互的方式
Apr 09 Python
Python解惑之整数比较详解
Apr 24 Python
基于numpy.random.randn()与rand()的区别详解
Apr 17 Python
python中实现将多个print输出合成一个数组
Apr 19 Python
python和shell获取文本内容的方法
Jun 05 Python
10招!看骨灰级Pythoner玩转Python的方法
Apr 15 Python
python爬虫爬取幽默笑话网站
Oct 24 Python
通过实例了解Python str()和repr()的区别
Jan 17 Python
python模式 工厂模式原理及实例详解
Feb 11 Python
Python如何基于Tesseract实现识别文字功能
Jun 05 Python
python函数超时自动退出的实操方法
Dec 28 Python
Pycharm 如何设置HTML文件自动补全代码或标签
May 21 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
IIS环境下快速安装、配置和调试PHP5.2.0
2006/12/17 PHP
PHP扩展模块Pecl、Pear以及Perl的区别
2014/04/09 PHP
ThinkPHP3.1查询语言详解
2014/06/19 PHP
PHP自定义函数实现格式化秒的方法
2016/09/14 PHP
解决laravel(5.5)访问public报错的问题
2019/10/12 PHP
JSON 学习之完全手册 图文
2007/05/29 Javascript
js this函数调用无需再次抓获id,name或标签名
2014/03/03 Javascript
jQuery多项选项卡的实现思路附样式及代码
2014/06/03 Javascript
javascript函数声明和函数表达式区别分析
2014/12/02 Javascript
javascript获取网页宽高方法汇总
2015/07/19 Javascript
jQuery简单创建节点的方法
2016/09/09 Javascript
JavaScript与ActionScript3两者的同性与差异性
2016/09/22 Javascript
基于JavaScript实现随机颜色输入框
2016/12/10 Javascript
基于jQuery实现数字滚动效果
2017/01/16 Javascript
微信小程序实现顶部普通选项卡效果(非swiper)
2020/06/19 Javascript
JS库之Particles.js中文开发手册及参数详解
2017/09/13 Javascript
深入理解Vue nextTick 机制
2018/04/28 Javascript
vue中rem的配置的方法示例
2018/08/30 Javascript
基于Nodejs的Tcp封包和解包的理解
2018/09/19 NodeJs
Angular单元测试之事件触发的实现
2020/01/20 Javascript
用Python实现QQ游戏大家来找茬辅助工具
2014/09/14 Python
Python实现多属性排序的方法
2018/12/05 Python
Python使用POP3和SMTP协议收发邮件的示例代码
2019/04/16 Python
浅谈tensorflow之内存暴涨问题
2020/02/05 Python
python实现输入三角形边长自动作图求面积案例
2020/04/12 Python
新西兰领先的鞋类和靴子网上商城:Merchant 1948
2017/09/08 全球购物
NBA欧洲商店(英国):NBA Europe Store UK
2018/07/27 全球购物
丝芙兰新加坡官网:Sephora新加坡
2018/12/04 全球购物
会计专业自我鉴定
2014/02/10 职场文书
店面销售职位的职责
2014/03/09 职场文书
学习计划书怎么写
2014/09/15 职场文书
2014年勤工助学工作总结
2014/11/24 职场文书
员工评语范文
2014/12/31 职场文书
项目安全员岗位职责
2015/02/15 职场文书
Mysql中 unique列插入重复值该怎么解决呢
2021/05/26 MySQL
基于Python实现nc批量转tif格式
2022/08/14 Python