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将多个excel文件合并为一个文件
Jan 03 Python
Sanic框架流式传输操作示例
Jul 18 Python
Python线程之定位与销毁的实现
Feb 17 Python
详解Python函数式编程—高阶函数
Mar 29 Python
linux下python中文乱码解决方案详解
Aug 28 Python
面向对象学习之pygame坦克大战
Sep 11 Python
python 实现多线程下载m3u8格式视频并使用fmmpeg合并
Nov 15 Python
Flask之pipenv虚拟环境的实现
Nov 26 Python
Django使用rest_framework写出API
May 21 Python
python pip如何手动安装二进制包
Sep 30 Python
python+playwright微软自动化工具的使用
Feb 02 Python
Python办公自动化之教你如何用Python将任意文件转为PDF格式
Jun 28 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/10/27 PHP
PHP中空字符串介绍0、null、empty和false之间的关系
2012/09/25 PHP
PHP正则表达式之定界符和原子介绍
2012/10/05 PHP
smarty简单分页的实现方法
2014/10/27 PHP
PHP中的常见魔术方法功能作用及用法实例
2015/07/01 PHP
Yii2实现跨mysql数据库关联查询排序功能代码
2017/02/10 PHP
Laravel 实现关系模型取出需要的字段
2019/10/10 PHP
laravel框架数据库配置及操作数据库示例
2019/10/10 PHP
Thinkphp 框架扩展之数据库驱动常用方法小结
2020/04/23 PHP
PHP 实现重载
2021/03/09 PHP
jQuery创建插件的代码分析
2011/04/14 Javascript
Jquery中对数组的操作代码
2011/08/12 Javascript
判断文件是否正在被使用的JS代码
2013/12/21 Javascript
JS过滤url参数特殊字符的实现方法
2013/12/24 Javascript
js跳转页面方法总结
2014/01/29 Javascript
js unicode 编码解析关于数据转换为中文的两种方法
2014/04/21 Javascript
JavaScript中逗号运算符介绍及使用示例
2015/03/13 Javascript
跟我学习javascript的函数和函数表达式
2015/11/16 Javascript
深入理解JS addLoadEvent函数
2016/05/20 Javascript
jQuery插件扩展extend的简单实现原理
2016/06/24 Javascript
js自调用匿名函数的三种写法(推荐)
2016/08/19 Javascript
Angular.JS学习之依赖注入$injector详析
2016/10/20 Javascript
JavaScript中无法通过div.style.left获取值的解决方法
2017/02/19 Javascript
vue.js+Echarts开发图表放大缩小功能实例
2017/06/09 Javascript
webpack 样式加载的实现原理
2018/06/12 Javascript
vite2.0+vue3移动端项目实战详解
2021/03/03 Vue.js
python中的break、continue、exit()、pass全面解析
2017/08/05 Python
Python cookbook(数据结构与算法)从字典中提取子集的方法示例
2018/03/22 Python
python+pandas+时间、日期以及时间序列处理方法
2018/07/10 Python
Python弹出输入框并获取输入值的实例
2019/06/18 Python
解决Python logging模块无法正常输出日志的问题
2020/02/21 Python
OpenCV 之按位运算举例解析
2020/06/19 Python
C面试题
2015/10/08 面试题
会计自荐信范文
2014/03/09 职场文书
决心书范文
2014/03/11 职场文书
竞选班干部演讲稿100字
2014/08/20 职场文书