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实现的jpg格式图片修复代码
Apr 21 Python
在Debian下配置Python+Django+Nginx+uWSGI+MySQL的教程
Apr 25 Python
解决python3捕获cx_oracle抛出的异常错误问题
Oct 18 Python
Django Rest framework之认证的实现代码
Dec 17 Python
win10子系统python开发环境准备及kenlm和nltk的使用教程
Oct 14 Python
使用TensorFlow-Slim进行图像分类的实现
Dec 31 Python
浅谈ROC曲线的最佳阈值如何选取
Feb 28 Python
Python Selenium截图功能实现代码
Apr 26 Python
Python 中 sorted 如何自定义比较逻辑
Feb 02 Python
matplotlib bar()实现百分比堆积柱状图
Feb 24 Python
python爬虫--selenium模块
Mar 31 Python
OpenCV-Python实现轮廓拟合
Jun 08 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 多维数组排序(usort,uasort)
2010/06/30 PHP
PHP中实现crontab代码分享
2015/03/26 PHP
PHP实现伪静态方法汇总
2016/01/13 PHP
简单谈谈PHP中的trait
2017/02/25 PHP
php单元测试phpunit入门实例教程
2017/11/17 PHP
PHP unlink与rmdir删除目录及目录下所有文件实例代码
2018/02/07 PHP
php写入txt乱码的解决方法
2019/09/17 PHP
Thinkphp模板没有解析直接原样输出的解决方法
2014/10/31 Javascript
JavaScript中的prototype原型学习指南
2016/05/09 Javascript
javascript获取网页各种高宽及位置的方法总结
2016/07/27 Javascript
webpack+vue+express(hot)热启动调试简单配置方法
2018/09/19 Javascript
vue使用prop可以渲染但是打印台报错的解决方式
2019/11/13 Javascript
小程序如何写动态标签的实现方法
2020/02/05 Javascript
[00:11]战神迅矛
2019/03/06 DOTA
[42:24]完美世界DOTA2联赛循环赛 LBZS vs DM BO2第一场 11.01
2020/11/02 DOTA
复习Python中的字符串知识点
2015/04/14 Python
python利用rsa库做公钥解密的方法教程
2017/12/10 Python
Python 限制线程的最大数量的方法(Semaphore)
2019/02/22 Python
Python提取PDF内容的方法(文本、图像、线条等)
2019/09/25 Python
python读取多层嵌套文件夹中的文件实例
2020/02/27 Python
如何用python免费看美剧
2020/08/11 Python
三星美国官网:Samsung美国
2017/02/06 全球购物
美国最受欢迎的度假目的地优惠套餐:BookVIP
2018/09/27 全球购物
英国最受信任的在线眼镜商之一:Fashion Eyewear
2019/10/31 全球购物
意大利网上药房:Farmacia 33
2020/01/27 全球购物
weblogic面试题
2016/03/07 面试题
数据员岗位职责
2013/11/19 职场文书
法人委托书
2014/07/31 职场文书
离婚案件被告代理词
2015/05/23 职场文书
2015年试用期工作总结范文
2015/05/28 职场文书
Anaconda安装pytorch及配置PyCharm 2021环境
2021/06/04 Python
React中的Context应用场景分析
2021/06/11 Javascript
利用 SQL Server 过滤索引提高查询语句的性能分析
2021/07/15 SQL Server
Python字符串常规操作小结
2022/04/03 Python
Python 一键获取电脑浏览器的账号密码
2022/05/11 Python
win10电脑老是死机怎么办?win10系统老是死机的解决方法
2022/08/05 数码科技