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 相关文章推荐
合并百度影音的离线数据( with python 2.3)
Aug 04 Python
Python使用win32com实现的模拟浏览器功能示例
Jul 13 Python
python之从文件读取数据到list的实例讲解
Apr 19 Python
用python3教你任意Html主内容提取功能
Nov 05 Python
5分钟 Pipenv 上手指南
Dec 20 Python
python实现图片彩色转化为素描
Jan 15 Python
对python 通过ssh访问数据库的实例详解
Feb 19 Python
Python使用POP3和SMTP协议收发邮件的示例代码
Apr 16 Python
Python列表切片常用操作实例解析
Dec 16 Python
python产生模拟数据faker库的使用详解
Nov 04 Python
Cpython解释器中的GIL全局解释器锁
Nov 09 Python
python 如何停止一个死循环的线程
Nov 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
header中Content-Disposition的作用与使用方法
2012/06/13 PHP
PHP容易忘记的知识点分享
2013/04/30 PHP
thinkPHP框架实现的短信接口验证码功能示例
2018/06/20 PHP
jquery 操作DOM案例代码分享
2012/04/05 Javascript
AngularJS入门知识之MVW类框架的编程思想探讨
2014/12/08 Javascript
jQuery实现可用于博客的动态滑动菜单
2015/03/09 Javascript
JavaScript判断数组是否包含指定元素的方法
2015/07/01 Javascript
jQuery实现的手机发送验证码倒计时效果代码分享
2015/08/24 Javascript
jquery图片倾斜层叠切换特效代码分享
2015/08/27 Javascript
浅析Bootstrap验证控件的使用
2016/06/23 Javascript
JavaScript数据存储 Cookie篇
2016/07/02 Javascript
利用Angularjs实现幻灯片效果
2016/09/07 Javascript
jQuery使用animate实现ul列表项相互飘动效果示例
2016/09/16 Javascript
Vue.js双向绑定操作技巧(初级入门)
2016/12/27 Javascript
微信小程序Server端环境配置详解(SSL, Nginx HTTPS,TLS 1.2 升级)
2017/01/12 Javascript
js轮播图无缝滚动效果
2017/06/17 Javascript
纯js封装的ajax功能函数与用法示例
2018/05/14 Javascript
ES6基础之默认参数值
2019/02/21 Javascript
详解Vue 全局变量,局部变量
2019/04/17 Javascript
用JS实现选项卡
2020/03/23 Javascript
Python中的ctime()方法使用教程
2015/05/22 Python
深入理解Django自定义信号(signals)
2018/10/15 Python
python字符串分割及字符串的一些常规方法
2019/07/24 Python
Python学习笔记之For循环用法详解
2019/08/14 Python
韩国爱茉莉太平洋化妆品美国站:Amore Pacific US
2016/10/28 全球购物
Bluebella美国官网:英国性感内衣品牌
2018/10/04 全球购物
豪华床上用品 :Jennifer Adams
2019/09/15 全球购物
个人职业生涯规划书1500字
2013/12/31 职场文书
入党申请自荐书范文
2014/02/11 职场文书
2014乡镇干部纪律作风整顿思想汇报
2014/09/13 职场文书
我们的节日元宵节活动总结
2015/02/06 职场文书
新娘父亲婚礼致辞
2015/07/27 职场文书
送给火锅店的创意营销方案!
2019/07/08 职场文书
用Python制作灯光秀短视频的思路详解
2021/04/13 Python
SQL Server内存机制浅探
2022/04/06 SQL Server
CSS SandBox应用场景及常见问题
2022/06/25 HTML / CSS