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异常处理总结
Aug 15 Python
python复制与引用用法分析
Apr 08 Python
python使用Tkinter显示网络图片的方法
Apr 24 Python
Python程序中用csv模块来操作csv文件的基本使用教程
Mar 03 Python
django url到views参数传递的实例
Jul 19 Python
django echarts饼图数据动态加载的实例
Aug 12 Python
解决Pycharm 导入其他文件夹源码的2种方法
Feb 12 Python
python查询MySQL将数据写入Excel
Oct 29 Python
Python基于Serializer实现字段验证及序列化
Nov 04 Python
python 实现一个图形界面的汇率计算器
Nov 09 Python
如何在C++中调用Python
May 21 Python
python opencv将多个图放在一个窗口的实例详解
Feb 28 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
菜鸟修复电子管记
2021/03/02 无线电
php下的权限算法的实现
2007/04/28 PHP
PHP性能优化 产生高度优化代码
2011/07/22 PHP
php提示Call-time pass-by-reference has been deprecated in的解决方法[已测]
2012/05/06 PHP
PHP实现的简易版图片相似度比较
2015/01/07 PHP
ThinkPHP3.2.3数据库设置新特性
2015/03/05 PHP
PHP排序算法之简单选择排序(Simple Selection Sort)实例分析
2018/04/20 PHP
PHP商品秒杀问题解决方案实例详解【mysql与redis】
2019/07/22 PHP
php判断某个方法是否存在函数function_exists (),method_exists()与is_callable()区别与用法解析
2020/04/20 PHP
js判断输入是否为数字的具体实例
2013/08/03 Javascript
jquery.post用法关于type设置问题补充
2014/01/03 Javascript
jQuery实现页面顶部显示的进度条效果完整实例
2015/12/09 Javascript
Angularjs 自定义服务的三种方式(推荐)
2016/08/02 Javascript
详谈js对url进行编码和解码(三种方式的区别)
2017/08/16 Javascript
JS组件系列之Gojs组件 前端图形化插件之利器
2017/11/29 Javascript
Node.JS段点续传:Nginx配置文件分段下载功能的实现方法
2018/03/12 Javascript
浅谈React高阶组件
2018/03/28 Javascript
微信小程序select下拉框实现效果
2019/05/15 Javascript
微信小程序实现日期格式化和倒计时
2020/11/01 Javascript
微信小程序拖拽排序列表的示例代码
2020/07/08 Javascript
js实现鼠标点击飘爱心效果
2020/08/19 Javascript
vue打开子组件弹窗都刷新功能的实现
2020/09/21 Javascript
python网络编程学习笔记(九):数据库客户端 DB-API
2014/06/09 Python
python实现人脸识别经典算法(一) 特征脸法
2018/03/13 Python
Numpy array数据的增、删、改、查实例
2018/06/04 Python
Django框架实现逆向解析url的方法
2018/07/04 Python
python去重,一个由dict组成的list的去重示例
2019/01/21 Python
python傅里叶变换FFT绘制频谱图
2019/07/19 Python
CSS3属性使网站设计增强同时不消弱可用性
2009/08/29 HTML / CSS
在canvas上实现元素图片镜像翻转动画效果的方法
2018/03/20 HTML / CSS
THE OUTNET美国官网:国际设计师品牌折扣网站
2017/03/07 全球购物
最新远光软件笔试题面试题内容
2013/11/08 面试题
高一家长会邀请函
2014/01/12 职场文书
办公室行政主管岗位职责
2015/04/09 职场文书
2016银行招聘自荐信
2016/01/28 职场文书
JS不要再到处使用绝对等于运算符了
2021/04/30 Javascript