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实现自动重启本程序的方法
Jul 09 Python
详解Django中的form库的使用
Jul 18 Python
对Python的Django框架中的项目进行单元测试的方法
Apr 11 Python
Python采用Django制作简易的知乎日报API
Aug 03 Python
python下setuptools的安装详解及No module named setuptools的解决方法
Jul 06 Python
在python中pandas读文件,有中文字符的方法
Dec 12 Python
Python中出现IndentationError:unindent does not match any outer indentation level错误的解决方法
Apr 18 Python
用python做游戏的细节详解
Jun 25 Python
Python在cmd上打印彩色文字实现过程详解
Aug 07 Python
利用 Flask 动态展示 Pyecharts 图表数据方法小结
Sep 04 Python
wxPython实现分隔窗口
Nov 19 Python
python文件操作seek()偏移量,读取指正到指定位置操作
Jul 05 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中获取关键词及所属来源搜索引擎名称的代码
2011/02/15 PHP
PHP基于mcript扩展实现对称加密功能示例
2019/02/21 PHP
Yii框架ACF(accessController)简单权限控制操作示例
2019/04/26 PHP
linux mint下安装phpstorm2020包括JDK部分的教程详解
2020/09/17 PHP
游戏人文件夹程序 ver 4.03
2006/07/14 Javascript
为jquery.ui.dialog 增加“在当前鼠标位置打开”的功能
2009/11/24 Javascript
Javascript继承机制的设计思想分享
2011/08/28 Javascript
找出字符串中出现次数最多的字母和出现次数精简版
2012/11/07 Javascript
纯css+js写的一个简单的tab标签页带样式
2014/01/28 Javascript
关于onchange事件在IE和FF下的表现及解决方法
2014/03/08 Javascript
通过jquery 获取URL参数并进行转码
2014/08/18 Javascript
jQuery中removeClass()方法用法实例
2015/01/05 Javascript
javascript浏览器窗口之间传递数据的方法
2015/01/20 Javascript
JQuery实现样式设置、追加、移除与切换的方法
2015/06/11 Javascript
jQuery基于cookie实现的购物车实例分析
2015/12/24 Javascript
微信JS接口大全
2016/08/25 Javascript
值得分享的JavaScript实现图片轮播组件
2016/11/21 Javascript
JavaScript之Vue.js【入门基础】
2016/12/06 Javascript
无限循环轮播图之运动框架(原生JS实现)
2017/10/01 Javascript
AngularJS 中的数据源的循环输出
2017/10/12 Javascript
纯html+css+javascript实现楼层跳跃式的页面布局(实例代码)
2017/10/25 Javascript
python内置函数:lambda、map、filter简单介绍
2017/11/16 Python
Django中的用户身份验证示例详解
2019/08/07 Python
详解python日志输出使用配置文件格式
2021/02/10 Python
佳能德国网上商店:Canon德国
2017/03/18 全球购物
比较基础的php面试题及答案-编程题
2012/10/14 面试题
应届大学生求职信
2013/12/01 职场文书
教育技术学专业职业规划书
2014/03/03 职场文书
高等教育专业自荐信范文
2014/03/26 职场文书
感恩的演讲稿
2014/05/06 职场文书
先进事迹演讲稿
2014/09/01 职场文书
护士工作失误检讨书
2014/09/14 职场文书
2015年初中教务处工作总结
2015/07/21 职场文书
2016年3月份红领巾广播稿
2015/12/21 职场文书
python munch库的使用解析
2021/05/25 Python
详解Spring Boot使用系统参数表提升系统的灵活性
2021/06/30 Java/Android