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求两个文本文件以行为单位的交集、并集与差集的方法
Jun 17 Python
Python上传package到Pypi(代码简单)
Feb 06 Python
Django中redis的使用方法(包括安装、配置、启动)
Feb 21 Python
Python3使用正则表达式爬取内涵段子示例
Apr 22 Python
解决python xx.py文件点击完之后一闪而过的问题
Jun 24 Python
python装饰器常见使用方法分析
Jun 26 Python
Django的Modelforms用法简介
Jul 27 Python
python3实现mysql导出excel的方法
Jul 31 Python
Python爬取视频(其实是一篇福利)过程解析
Aug 01 Python
解决Django删除migrations文件夹中的文件后出现的异常问题
Aug 31 Python
Python实现病毒仿真器的方法示例(附demo)
Feb 19 Python
python爬虫要用到的库总结
Jul 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
用js进行url编码后用php反解以及用php实现js的escape功能函数总结
2010/02/08 PHP
PHP 双链表(SplDoublyLinkedList)简介和使用实例
2015/05/12 PHP
php指定长度分割字符串str_split函数用法示例
2017/01/30 PHP
PHP使用preg_split()分割特殊字符(元字符等)的方法分析
2017/02/04 PHP
PHP新特性详解之命名空间、性状与生成器
2017/07/18 PHP
非常不错的一个javascript 类
2006/11/07 Javascript
Js 获取HTML DOM节点元素的方法小结
2009/04/24 Javascript
JS中动态添加事件(绑定事件)的代码
2011/01/09 Javascript
16个最流行的JavaScript框架[推荐]
2011/05/29 Javascript
JQuery教学之性能优化
2014/05/14 Javascript
javascript+css3 实现动态按钮菜单特效
2016/02/06 Javascript
jQuery实现验证年龄简单思路
2016/02/24 Javascript
jQuery点击其他地方时菜单消失的实现方法
2016/04/22 Javascript
layui表格实现代码
2017/05/20 Javascript
JavaScript实现选中文字提示新浪微博分享效果
2017/06/15 Javascript
使用JavaScript实现点击循环切换图片效果
2017/09/03 Javascript
React Native 真机断点调试+跨域资源加载出错问题的解决方法
2018/01/18 Javascript
vue.js配合$.post从后台获取数据简单demo分享
2018/08/11 Javascript
解析JS在获取当前月的最后一天遇到的坑
2019/08/30 Javascript
python中使用enumerate函数遍历元素实例
2014/06/16 Python
python实现下载整个ftp目录的方法
2017/01/17 Python
python实现广度优先搜索过程解析
2019/10/19 Python
python多进程重复加载的解决方式
2019/12/13 Python
Keras Convolution1D与Convolution2D区别说明
2020/05/22 Python
CSS3实现莲花绽放的动画效果
2020/11/06 HTML / CSS
Html5移动端适配IphoneX等机型的方法
2019/06/25 HTML / CSS
美国一家运动专业鞋类零售商:Warehouse Shoe Sale(WSS)
2018/03/28 全球购物
英国婴儿和儿童服装网站:Vertbaudet
2018/04/02 全球购物
C语言编程练习
2012/04/02 面试题
python+selenium小米商城红米K40手机自动抢购的示例代码
2021/03/24 Python
自主招生自荐信
2013/12/08 职场文书
安全生产汇报材料
2014/02/17 职场文书
激励口号大全
2014/06/17 职场文书
2015大学生党员自我评价范文
2015/03/03 职场文书
2015年七夕情人节活动方案
2015/05/06 职场文书
Dashboard管理Kubernetes集群与API访问配置
2022/04/01 Servers