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中的Descriptor描述符学习教程
Jun 02 Python
Python中摘要算法MD5,SHA1简介及应用实例代码
Jan 09 Python
python web基础之加载静态文件实例
Mar 20 Python
Python 字符串与数字输出方法
Jul 16 Python
python 已知一个字符,在一个list中找出近似值或相似值实现模糊匹配
Feb 29 Python
Python钉钉报警及Zabbix集成钉钉报警的示例代码
Aug 17 Python
python能做哪些生活有趣的事情
Sep 09 Python
2020版Python学习路线图(附学习资料)
Sep 15 Python
Python collections模块的使用方法
Oct 09 Python
详解pandas赋值失败问题解决
Nov 29 Python
python中count函数知识点浅析
Dec 17 Python
python读取图片颜色值并生成excel像素画的方法实例
Feb 19 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调用三种数据库的方法(1)
2006/10/09 PHP
php保存二进制原始数据为图片的程序代码
2014/10/14 PHP
php防止sql注入简单分析
2015/03/18 PHP
php实现图片缩略图的方法
2016/03/29 PHP
imgAreaSelect 中文文档帮助说明
2011/10/08 Javascript
一个Action如何调用两个不同的方法
2014/05/22 Javascript
jQuery调取jSon数据并展示的方法
2015/01/29 Javascript
JavaScript中5种调用函数的方法
2015/03/12 Javascript
原生 JS Ajax,GET和POST 请求实例代码
2016/06/08 Javascript
jQuery  ready方法实现原理详解
2016/10/19 Javascript
纯JS代码实现隔行变色鼠标移入高亮
2016/11/23 Javascript
js移动焦点到最后位置的简单方法
2016/11/25 Javascript
JS字符串长度判断,超出进行自动截取的实例(支持中文)
2017/03/06 Javascript
JS判断Android、iOS或浏览器的多种方法(四种方法)
2017/06/29 Javascript
Vue $mount实战之实现消息弹窗组件
2019/04/22 Javascript
小程序实现左滑删除效果
2019/07/25 Javascript
d3.js 地铁轨道交通项目实战
2019/11/27 Javascript
使用JavaScript获取Django模板指定键值数据
2020/05/27 Javascript
用Javascript实现发送短信验证码间隔功能
2021/02/08 Javascript
[03:58]2014DOTA2国际邀请赛 龙宝赛后解密DK获胜之道
2014/07/14 DOTA
flask使用session保存登录状态及拦截未登录请求代码
2018/01/19 Python
Python3爬虫学习之爬虫利器Beautiful Soup用法分析
2018/12/12 Python
python实现维吉尼亚算法
2019/03/20 Python
对python中的*args与**kwgs的含义与作用详解
2019/08/28 Python
Python Tkinter Entry和Text的添加与使用详解
2020/03/04 Python
Python调用百度OCR实现图片文字识别的示例代码
2020/07/17 Python
pytorch下的unsqueeze和squeeze的用法说明
2021/02/06 Python
写出一个方法实现冒泡排序
2016/07/08 面试题
后勤人员自我鉴定
2013/10/20 职场文书
防灾减灾日活动总结
2014/08/26 职场文书
工程承包协议书范本
2014/09/29 职场文书
镇党政领导班子民主生活会思想汇报
2014/10/11 职场文书
团结主题班会
2015/08/13 职场文书
golang特有程序结构入门教程
2021/06/02 Python
Mysql忘记密码解决方法
2022/02/12 MySQL
阿里云日志过滤器配置日志服务
2022/04/09 Servers