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 流程控制实例代码
Sep 25 Python
Python中__new__与__init__方法的区别详解
May 04 Python
使用Python内置的模块与函数进行不同进制的数的转换
Mar 12 Python
解决Python出现_warn_unsafe_extraction问题的方法
Mar 24 Python
在numpy矩阵中令小于0的元素改为0的实例
Jan 26 Python
django中使用事务及接入支付宝支付功能
Sep 15 Python
如何修复使用 Python ORM 工具 SQLAlchemy 时的常见陷阱
Nov 19 Python
python加密解密库cryptography使用openSSL生成的密匙加密解密
Feb 11 Python
python 实现单例模式的5种方法
Sep 23 Python
详解Python利用configparser对配置文件进行读写操作
Nov 03 Python
python批量合成bilibili的m4s缓存文件为MP4格式 ver2.5
Dec 01 Python
如何使用flask将模型部署为服务
May 13 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
destoon公司主页模板风格的添加方法
2014/06/20 PHP
destoon切换城市后实现logo旁边显示地区名称的方法
2014/08/21 PHP
php导出CSV抽象类实例
2014/09/24 PHP
如何批量清理系统临时文件(语言:C#、 C/C++、 php 、python 、java )
2016/02/01 PHP
PHP合并数组的2种方法小结
2016/11/24 PHP
PHP进阶学习之垃圾回收机制详解
2019/06/18 PHP
php实现图片压缩处理
2020/09/09 PHP
一个简单的js树形菜单
2011/12/09 Javascript
JavaScript计算字符串中每个字符出现次数的小例子
2013/07/02 Javascript
JQuery插件iScroll实现下拉刷新,滚动翻页特效
2014/06/22 Javascript
JS 获取鼠标左右键的键值方法
2014/10/11 Javascript
js判断某个方法是否存在实例代码
2015/01/10 Javascript
JavaScript页面实时显示当前时间实例代码
2016/10/23 Javascript
Vue中android4.4不兼容问题的解决方法
2018/09/04 Javascript
javascript实现函数柯里化与反柯里化过程解析
2019/10/08 Javascript
微信小程序点击保存图片到本机功能
2019/12/13 Javascript
JS实现轮播图效果
2020/01/11 Javascript
js实现从右往左匀速显示图片(无缝轮播)
2020/06/29 Javascript
js实现翻牌小游戏
2020/07/31 Javascript
[05:09]2016国际邀请赛中国区预选赛淘汰赛首日精彩回顾
2016/06/29 DOTA
Python的高级Git库 Gittle
2014/09/22 Python
Python字符串切片操作知识详解
2016/03/28 Python
python 网络编程常用代码段
2016/08/28 Python
Python 基础教程之闭包的使用方法
2017/09/29 Python
Python基于列表list实现的CRUD操作功能示例
2018/01/05 Python
Python实现重建二叉树的三种方法详解
2018/06/23 Python
python调用java的jar包方法
2018/12/15 Python
Pycharm使用之设置代码字体大小和颜色主题的教程
2019/07/12 Python
2020最新pycharm汉化安装(python工程狮亲测有效)
2020/04/26 Python
matplotlib基础绘图命令之errorbar的使用
2020/08/13 Python
HTML5表单验证特性(知识点小结)
2020/03/10 HTML / CSS
预备党员政审材料
2014/02/04 职场文书
学雷锋标兵事迹材料
2014/08/18 职场文书
竞选班长演讲稿400字
2014/08/22 职场文书
《浅水洼里的小鱼》教学反思
2016/02/16 职场文书
2019年关于小学生课外阅读情况的分析报告
2019/12/02 职场文书