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 相关文章推荐
Python2.x版本中maketrans()方法的使用介绍
May 19 Python
Python和Perl绘制中国北京跑步地图的方法
Mar 03 Python
numpy自动生成数组详解
Dec 15 Python
python绘制简单折线图代码示例
Dec 19 Python
python 用lambda函数替换for循环的方法
Jun 09 Python
对Python捕获控制台输出流的方法详解
Jan 07 Python
Python Web程序搭建简单的Web服务器
Jul 31 Python
python读取ini配置的类封装代码实例
Jan 08 Python
Python基于QQ邮箱实现SSL发送
Apr 26 Python
python调用百度API实现人脸识别
Nov 17 Python
python中类与对象之间的关系详解
Dec 16 Python
tensorboard 可视化之localhost:6006不显示的解决方案
May 22 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中关于codeigniter的xmlrpc的类在进行数据交换时的类型问题
2011/07/03 PHP
PHP Undefined index报错的修复方法
2011/07/17 PHP
国产PHP开发框架myqee新手快速入门教程
2014/07/14 PHP
php操作xml入门之xml基本介绍及xml标签元素
2015/01/23 PHP
php实现图片缩略图的方法
2016/03/29 PHP
Netbeans 8.2将支持PHP7 更精彩
2016/06/13 PHP
某页码显示的helper 少量调整,另附js版
2010/09/12 Javascript
解析Jquery取得iframe中元素的几种方法
2013/07/04 Javascript
js固定DIV高度,超出部分自动添加滚动条的简单方法
2013/07/10 Javascript
js和php如何获取当前url的内容
2013/09/22 Javascript
js 获取页面高度和宽度兼容 ie firefox chrome等
2014/05/14 Javascript
JS中使用sort结合localeCompare实现中文排序实例
2014/07/23 Javascript
JS+CSS实现自动改变切换方向图片幻灯切换效果的方法
2015/03/02 Javascript
confirm确认对话框的实现方法总结
2016/06/17 Javascript
Summernote实现图片上传功能的简单方法
2016/07/11 Javascript
Node.js的文件权限及读写flag详解
2016/10/11 Javascript
js自制图片放大镜功能
2017/01/24 Javascript
vue.js的提示组件
2017/03/02 Javascript
手写Node静态资源服务器的实现方法
2018/03/20 Javascript
JS实现京东商品分类侧边栏
2020/12/11 Javascript
[00:27]DOTA2战队VP、Secret贺新春
2018/02/11 DOTA
pymongo实现多结果进行多列排序的方法
2015/05/16 Python
从零开始学Python第八周:详解网络编程基础(socket)
2016/12/14 Python
Pytorch实现LSTM和GRU示例
2020/01/14 Python
opencv中图像叠加/图像融合/按位操作的实现
2020/04/01 Python
python使用for...else跳出双层嵌套循环的方法实例
2020/05/17 Python
Python如何把字典写入到CSV文件的方法示例
2020/08/23 Python
机械专业毕业生自荐信
2013/11/02 职场文书
美发活动策划书
2014/01/14 职场文书
人事专员职责
2014/02/22 职场文书
质量月口号
2014/06/20 职场文书
补充协议书
2015/01/28 职场文书
2015年政府采购工作总结
2015/05/21 职场文书
工作态度怎么写
2015/06/25 职场文书
丧事主持词
2015/07/02 职场文书
Python集合set()使用的方法详解
2022/03/18 Python