Python正则表达式高级使用方法汇总
正则表达式是一个以简单直观的方式匹配指定文本信息从而达到查找、替换等操作的目的。正则表达式以其简单而高效的特点使得其在数据分析和数据验证方面应用广泛。
对于简单的正则表达式可以直接百度之,这里重点引荐下‘特殊’操作。
1.非贪婪模式 – {x,y}?
非贪婪模式是指在使用正则匹配时,尽可能少的匹配(默认是贪婪模式,即:尽可能多的匹配)。例:
re.search(r'[d]{2,5}?’,’091234568′) <_sre.SRE_Match object; span=(0, 2), match=’09’
在这里{2,5}?匹配只是匹配2-5个[d]时只要满足2(最少的)个就好,在看看贪婪模式:
re.search(r'[d]{2,5}’,’091234568′) <_sre.SRE_Match object; span=(0, 5), match=’09123′
这时候,匹配2-5个[d]时,默认匹配最多的5个。
注意:贪婪和非贪婪模式的区别就是重复操作符后有没有?字符
2.分组
正则表达式提供了一个机制将表达式分组,匹配的结果也将按照表达式单独分组。例:
m = re.search(r'(d{3})-(d{5})','029-25642')
m.group()
'029-25642'
m.groups()
('029', '25642')
m.group(2)
'25642'
可以通过m.groups()看到分组匹配结果,通过m.group(index)查看具体编号的分组结果(编号从1开始,0是完整的匹配)。那分组有什么用呢,好像也没什么特殊的含义,不急,下面会用到。
3.引用分组(回溯) – N
有这么一种情况,比如假设我要找出一个html文本中的所有<a </a 标签,怎么办?试试这样:
re.search(r'<(w+) .+</(w+) ‘,'<a this is a demo</e ‘) <_sre.SRE_Match object; span=(0, 21), match='<a this is a demo</e ‘
奇怪的事情来了,为什么<a </e 被匹配成功了,显然结果并不是想要的,那怎么才能只匹配<a </a 而过滤掉其他的呢(比如<a </e )?答案就是引用分组,例:
re.search(r'<(w+) .+</1 ‘,'<a this is a demo</e <p demo two</p ‘) <_sre.SRE_Match object; span=(21, 36), match='<p demo two</p ‘
这里1是关键,意思就是当前位置匹配的结果需要和第一个分组匹配的结果一致,或者说第一个分组的匹配结果期望在这里再次出现。以此类推。该方法最多只能匹配前99个分组。
4.分组命名 – (?P<name .*)
分组命名最开始由python引入,比如Django路由中会用到。分组命名的好处是方便,直接使用名字比编号要简单而且不会变化,例:
m = re.search(r'(?P<first_name d{3})-(?P<second_name d{4})','029-8967')
m.group('first_name')
'029'
m.groupdict()
{'first_name': '029', 'second_name': '8967'}
当然,命名分组仍然是编号分组,依然可以使用编号进行查找分组。
5.先行断言 – X(?!Y)、X(?=Y)
假设有这么一种情况,要查找所有163信箱的文本,也就是@163.com结尾的所有email账号信息,也就是说不要@163.com这部分,但是其还要参与匹配。这就用到了先行断言,也即基于之后的内容是否存在接收或拒绝一个匹配,而不需要接下来的内容作为匹配的一部分。例:
re.search(r’h(?!e)’,’hello home!’) <_sre.SRE_Match object; span=(6, 7), match=’h’
h(?!e)表示匹配h,而且h后面不能是e,此处匹配成功的是home,但是只返回h
re.search(r’h(?=e)’,’hello home!’) <_sre.SRE_Match object; span=(0, 1), match=’h’
h(?=e)表示匹配he,此处匹配成功的是hello,但是只返回h
6.标记
- 不区分大小写:re.IGNORECASE(简写re.I)-使得正则表达式不区分大小写
- 点匹配换行符:re.DOTALL(简写re.S)-使得 . 符号可以匹配换行符
- 多行模式:re.MULTILINE(简写re.M)-使得^$字符可以匹配任意行的开始与结束
- 详细模式:re.VERBOSE(简写re.X)-使得正则表达式可以换行书写,且可以加入注释
- 调试模式:re.DEBUG-将调试信息输出到sys.stderr
- 使用多个标记时,使用|分隔,如re.S|re.M
以上就是本文的全部内容,希望对大家的学习有所帮助。
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 基于IdentityServer4的OIDC实现单点登录(SSO)原理简析
- OpenGL ES 变量、结构体、语句、函数、精度
- OpenGL ES for Android 绘制矩形和正方形
- OpenGL ES for Android 绘制立方体
- 服务化最佳实践
- OpenGL ES for Android 深度测试
- OpenGL ES for Android 绘制旋转的地球
- [Hei.Captcha] Asp.Net Core 跨平台图形验证码实现
- Asp.Net Core 3.1 获取不到Post、Put请求的内容 System.NotSupportedException Specified method is not supported
- OpenGL ES for Android 播放视频
- Centos 7 在线安装 离线安装 最新 Docker-compose 的正确姿势 实践笔记
- OpenGL ES for Android 视频缩放、旋转、平移
- OpenGL ES for Android 相机预览
- OpenGL ES for Android 相机预览适配不同分辨率的手机
- Flutter Widgets 之 Container