Python正则表达式高级使用方法汇总


Posted in Python onJune 18, 2020

正则表达式是一个以简单直观的方式匹配指定文本信息从而达到查找、替换等操作的目的。正则表达式以其简单而高效的特点使得其在数据分析和数据验证方面应用广泛。

对于简单的正则表达式可以直接百度之,这里重点引荐下‘特殊'操作。

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python实现排序算法
Feb 14 Python
Python基于property实现类的特性操作示例
Jun 15 Python
python实现俄罗斯方块
Jun 26 Python
python爬取指定微信公众号文章
Dec 20 Python
python utc datetime转换为时间戳的方法
Jan 15 Python
pyqt5 获取显示器的分辨率的方法
Jun 18 Python
浅谈Pandas Series 和 Numpy array中的相同点
Jun 28 Python
python写日志文件操作类与应用示例
Jul 01 Python
基于pandas中expand的作用详解
Dec 17 Python
使用Python爬虫库requests发送表单数据和JSON数据
Jan 25 Python
用python制作个视频下载器
Feb 01 Python
python利用while求100内的整数和方式
Nov 07 Python
将tf.batch_matmul替换成tf.matmul的实现
Jun 18 #Python
新手常见Python错误及异常解决处理方案
Jun 18 #Python
Python之Matplotlib文字与注释的使用方法
Jun 18 #Python
Matplotlib自定义坐标轴刻度的实现示例
Jun 18 #Python
浅谈keras中的batch_dot,dot方法和TensorFlow的matmul
Jun 18 #Python
PyCharm中配置PySide2的图文教程
Jun 18 #Python
python属于软件吗
Jun 18 #Python
You might like
PHP编程基本语法快速入门手册
2016/01/07 PHP
PHP+Mysql无刷新问答评论系统(源码)
2016/12/20 PHP
Laravel登录失败次数限制的实现方法
2020/08/26 PHP
document.all还是document.getElementsByName?
2006/07/21 Javascript
JS加ASP二级域名转向的代码
2007/05/17 Javascript
浅谈JSON和JSONP区别及jQuery的ajax jsonp的使用
2014/11/23 Javascript
js实现编辑div节点名称的方法
2014/12/17 Javascript
JavaScript数据类型详解
2015/04/01 Javascript
jQuery实现仿路边灯箱广告图片轮播效果
2015/04/15 Javascript
jQuery解析json格式数据简单实例
2016/01/22 Javascript
js HTML5 Ajax实现文件上传进度条功能
2016/02/13 Javascript
Javascript+CSS3实现进度条效果
2016/10/28 Javascript
javascript判断元素存在和判断元素存在于实时的dom中的方法
2017/01/17 Javascript
javascript数据类型详解
2017/02/07 Javascript
基于HTML5+JS实现本地图片裁剪并上传功能
2017/03/24 Javascript
解决ztree搜索中多级菜单展示不全问题
2017/07/05 Javascript
vue.js实现点击后动态添加class及删除同级class的实现代码
2018/04/04 Javascript
vue技术分享之你可能不知道的7个秘密
2018/04/09 Javascript
使用 electron 实现类似新版 QQ 的登录界面效果(阴影、背景动画、窗体3D翻转)
2018/10/23 Javascript
Vue加载json文件的方法简单示例
2019/01/28 Javascript
vue在index.html中引入静态文件不生效问题及解决方法
2019/04/29 Javascript
[01:08:29]DOTA2-DPC中国联赛定级赛 RNG vs Aster BO3第一场 1月9日
2021/03/11 DOTA
用Python写飞机大战游戏之pygame入门(4):获取鼠标的位置及运动
2015/11/05 Python
利用python微信库itchat实现微信自动回复功能
2017/05/18 Python
tensorflow入门之训练简单的神经网络方法
2018/02/26 Python
学会python自动收发邮件 代替你问候女友
2020/05/20 Python
Keras实现将两个模型连接到一起
2020/05/23 Python
基于opencv实现简单画板功能
2020/08/02 Python
Python tkinter界面实现历史天气查询的示例代码
2020/08/23 Python
python 动态绘制爱心的示例
2020/09/27 Python
Currentbody德国站:健康与美容技术专家
2020/04/05 全球购物
《金钱的魔力》教学反思
2014/02/24 职场文书
物流专业求职信
2014/06/30 职场文书
大学生国家助学金感谢信
2015/01/23 职场文书
匿名检举信范文
2015/03/02 职场文书
用Python生成会跳舞的美女
2022/01/18 Python