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 相关文章推荐
解决Mac安装scrapy失败的问题
Jun 13 Python
获取python的list中含有重复值的index方法
Jun 27 Python
python保存网页图片到本地的方法
Jul 24 Python
python opencv 读取本地视频文件 修改ffmpeg的方法
Jan 26 Python
python实现AES加密解密
Mar 28 Python
python 如何去除字符串头尾的多余符号
Nov 19 Python
python实现简单图书管理系统
Nov 22 Python
python实现提取COCO,VOC数据集中特定的类
Mar 10 Python
Python获取对象属性的几种方式小结
Mar 12 Python
使用gunicorn部署django项目的问题
Dec 30 Python
matplotlib运行时配置(Runtime Configuration,rc)参数rcParams解析
Jan 05 Python
Python+OpenCV实现在图像上绘制矩形
Mar 21 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&amp;&amp;mysql)五
2006/10/09 PHP
PHP 学习路线与时间表
2010/02/21 PHP
解决PhpMyAdmin中导入2M以上大文件限制的方法分享
2014/06/06 PHP
PHP的swoole扩展安装方法详细教程
2016/05/18 PHP
golang与php实现计算两个经纬度之间距离的方法
2016/07/22 PHP
使用laravel的migrate创建数据表的方法
2019/09/30 PHP
Javascript Cookie读写删除操作的函数
2010/03/02 Javascript
JavaScript控制图片加载完成后调用回调函数的方法
2015/03/20 Javascript
基于dropdown.js实现的两款美观大气的二级导航菜单
2015/09/02 Javascript
IE9+已经不对document.createElement向下兼容的解决方法
2015/09/14 Javascript
浅析Nodejs npm常用命令
2016/06/14 NodeJs
BootStrap中的表单大全
2016/09/07 Javascript
详解JavaScript权威指南之对象
2016/09/27 Javascript
简单三步实现报表页面集成天气
2016/12/15 Javascript
Linux系统中利用node.js提取Word(doc/docx)及PDF文本的内容
2017/06/17 Javascript
前端主流框架vue学习笔记第一篇
2017/07/26 Javascript
angularjs中$http异步上传Excel文件方法
2018/02/23 Javascript
vue进入页面时滚动条始终在底部代码实例
2019/03/26 Javascript
微信小程序的开发范式BeautyWe.js入门详解
2019/07/10 Javascript
webpack打包优化的几个方法总结
2020/02/10 Javascript
Python学生信息管理系统修改版
2018/03/13 Python
python 用下标截取字符串的实例
2018/12/25 Python
Python HTML解析模块HTMLParser用法分析【爬虫工具】
2019/04/05 Python
分析经典Python开发工程师面试题
2019/04/08 Python
wxPython实现带颜色的进度条
2019/11/19 Python
解决Python pip 自动更新升级失败的问题
2020/02/21 Python
keras 指定程序在某块卡上训练实例
2020/06/22 Python
python输入中文的实例方法
2020/09/14 Python
2014第二批党员干部对照“四风”找差距检查材料思想汇报
2014/09/18 职场文书
领导班子“四风问题”“整改方案
2014/10/02 职场文书
校园新闻广播稿5篇
2014/10/10 职场文书
见习报告怎么写
2014/10/31 职场文书
高三语文复习计划
2015/01/19 职场文书
研究生导师推荐信
2015/03/25 职场文书
电力安全学习心得体会
2016/01/18 职场文书
Vue Mint UI mt-swipe的使用方式
2022/06/05 Vue.js