分享

Python正则表达式,这一篇就够了

 copy_left 2021-01-11

大多数编程语言的正则表达式设计都师从Perl,所以语法基本相似,不同的是每种语言都有自己的函数去支持正则,今天我们就来学习 Python中关于 正则表达式的函数。

Python正则表达式,这一篇就够了

re模块主要定义了9个常量、12个函数、1个异常,每个常量和函数猪哥 都会通过实际代码案例讲解,让大家能更直观了解其作用!

注:为避免出现代码格式错乱,猪哥尽量使用代码截图演示哦。

一、re模块简介

聊到Python正则表达式的支持,首先肯定会想到 re 库,这是一个Python处理文本的 标准库

标准库 的意思表示这是一个 Python内置模块 ,不需要额外下载,目前Python内置模块大概有300个。可以在这里查看Python所有的内置模块:https://docs./3/py-modindex.html#cap-r

因为re是内置模块,所以不需要再下载,使用时直接引入即可:

import re

re模块官方文档:https://docs./zh-cn/3.8/library/re.html

re模块库源码:https://github.com/python/cpython/blob/3.8/Lib/re.py

二、re模块常量

常量即表示不可更改的变量,一般用于做标记。

re模块中有9个常量,常量的值都是int类型!

Python正则表达式,这一篇就够了

上图我们可以看到,所有的常量都是在 RegexFlag枚举类 来实现,这是在Python 3.6做的改版。在Python 3.6以前版本是直接将常量写在re.py中,使用枚举的好处就是方便管理和使用!

Python正则表达式,这一篇就够了

下面我们来快速学习这些常量的作用及如何使用他们,按常用度排序!

1. IGNORECASE

语法: re.IGNORECASE 或简写为 re.I

作用: 进行忽略大小写匹配。

代码案例:

Python正则表达式,这一篇就够了

在默认匹配模式下 大写字母B 无法匹配 小写字母b ,而在 忽略大小写 模式下是可以的。

2. ASCII

语法: re.ASCII 或简写为 re.A

作用: 顾名思义,ASCII表示ASCII码的意思,让 \w , \W , \b , \B , \d , \D , \s\S只匹配ASCII,而不是Unicode。

代码案例:

Python正则表达式,这一篇就够了

在默认匹配模式下 \w+ 匹配到了所有字符串,而在 ASCII 模式下,只匹配到了a、b、c(ASCII编码支持的字符)。

注意:这只对字符串匹配模式有效,对字节匹配模式无效。

3. DOTALL

语法: re.DOTALL 或简写为 re.S

作用: DOT表示 . ,ALL表示所有,连起来就是 . 匹配所有,包括换行符 \n默认模式下 . 是不能匹配行符 \n

代码案例:

Python正则表达式,这一篇就够了

在默认匹配模式下 . 并没有匹配换行符 \n ,而是将字符串分开匹配;而在 re.DOTALL 模式下,换行符 \n 与字符串一起被匹配到。

注意: 默认匹配模式下 . 并不会匹配换行符 \n

4. MULTILINE

语法: re.MULTILINE 或简写为 re.M

作用: 多行模式,当某字符串中有换行符 \n ,默认模式下是不支持换行符特性的,比如:行开头 和 行结尾,而多行模式下是支持匹配行开头的。

代码案例:

Python正则表达式,这一篇就够了

正则表达式中 ^ 表示匹配行的开头,默认模式下它只能匹配字符串的开头;而在多行模式下,它还可以匹配 换行符 \n 后面的字符。

注意:正则语法中 ^ 匹配行开头、 \A 匹配字符串开头,单行模式下它两效果一致,多行模式下 \A 不能识别 \n

5. VERBOSE

语法: re.VERBOSE 或简写为 re.X

作用: 详细模式,可以在正则表达式中加注解!

代码案例:

Python正则表达式,这一篇就够了

默认模式下并不能识别正则表达式中的注释,而详细模式是可以识别的。

当一个正则表达式十分复杂的时候,详细模式或许能为你提供另一种注释方式,但它不应该成为炫技的手段,建议谨慎考虑后使用!

6.LOCALE

语法: re.LOCALE 或简写为 re.L

作用: 由当前语言区域决定 \w , \W , \b , \B 和大小写敏感匹配,这个标记只能对byte样式有效。 这个标记官方已经不推荐使用 ,因为语言区域机制很不可靠,它一次只能处理一个 “习惯”,而且只对8位字节有效。

注意: 由于这个标记官方已经不推荐使用,而且猪哥也没使用过,所以就不给出实际的案例!

7.UNICODE

语法: re.UNICODE 或简写为 re.U

作用: 与 ASCII 模式类似,匹配unicode编码支持的字符,但是 Python 3 默认字符串已经是Unicode,所以有点冗余。

8. DEBUG

语法: re.DEBUG

作用: 显示编译时的debug信息。

代码案例:

Python正则表达式,这一篇就够了

虽然debug模式下确实会打印编译信息,但猪哥并不理解这是什么语言 以及表达的含义, 希望了解的朋友能不吝赐教。

9.TEMPLATE

语法: re.TEMPLATE 或简写为 re.T

作用: 猪哥也没搞懂TEMPLATE的具体用处,源码注释中写着: disable backtracking(禁用回溯),有了解的同学可以留言告知!

Python正则表达式,这一篇就够了

10. 常量总结

  1. 9个常量中,前5个(IGNORECASE、ASCII、DOTALL、MULTILINE、VERBOSE)有用处,两个(LOCALE、UNICODE)官方不建议使用、两个(TEMPLATE、DEBUG)试验性功能,不能依赖。
  2. 常量在re常用函数中都可以使用,查看源码可得知。
  3. 常量可叠加使用,因为常量值都是2的幂次方值,所以是可以叠加使用的,叠加时请使用 | 符号,请勿使用 + 符号!

最后来一张思维导图总结一下re模块中的常量吧, 需要高清图或者xmind文件的同学可在文章末尾

获取。

Python正则表达式,这一篇就够了

三、re模块函数

re模块有12个函数,猪哥将以功能分类来讲解;这样更具有比较性,同时也方便记忆。

1.查找一个匹配项

查找并返回一个匹配项的函数有3个: search、match、fullmatch ,他们的区别分别是:

  1. search 查找任意位置的匹配项
  2. match 必须从字符串开头匹配
  3. fullmatch 整个字符串与正则完全匹配

我们再来根据实际的代码案例比较:

案例1:

Python正则表达式,这一篇就够了

案例1中 search函数 是在字符串中任意位置匹配,只要有符合正则表达式的字符串就匹配成功,其实有两个匹配项,但search函数值返回一个。

match函数 是要从头开始匹配,而字符串开头多了个字母 a ,所以无法匹配, fullmatch函数 需要完全相同,故也不匹配!

案例2:

Python正则表达式,这一篇就够了

案例2删除了text最开头的字母a,这样 match函数 就可以匹配啦,而 fullmatch函数 依然不能完全匹配!

案例3:

Python正则表达式,这一篇就够了

案例3中,我们只留下一段文字,并且与正则表达式一致;这时 fullmatch函数 终于可以匹配了。

完整案例:

Python正则表达式,这一篇就够了

注意:查找 一个匹配项 返回的都是一个匹配对象(Match)。

2.查找多个匹配项

讲完查找一项,现在来看看查找多项吧,查找多项函数主要有: findall函数finditer函数

  1. findall 从字符串任意位置查找, 返回一个列表
  2. finditer :从字符串任意位置查找, 返回一个迭代器

两个方法基本类似,只不过一个是返回列表,一个是返回迭代器。我们知道列表是一次性生成在内存中,而迭代器是需要使用时一点一点生成出来的,内存使用更优。

Python正则表达式,这一篇就够了

如果可能存在大量的匹配项的话,建议使用 finditer函数 ,一般情况使用 findall函数 基本没啥影响。

3.分割

re.split(pattern, string, maxsplit=0, flags=0) 函数:用 pattern 分开 string , maxsplit 表示最多进行分割次数, flags 表示模式,就是上面我们讲解的常量!

Python正则表达式,这一篇就够了

注意: str 模块也有一个 split函数 ,那这两个函数该怎么选呢?

str.split函数功能简单,不支持正则分割,而re.split支持正则。

关于二者的速度如何? 猪哥实际测试了一下,在相同数据量的情况下使用 re.split 函数与 str.split

函数 执行次数执行时间 对比图:

Python正则表达式,这一篇就够了

通过上图对比发现,1000次循环以内 str.split 函数更快,而循环次数1000次以上后 re.split 函数明显更快,而且次数越多差距越大!

所以结论是: 在 不需要正则支持 且 数据量和数次不多 的情况下使用 str.split 函数更合适,反之则使用 re.split 函数 。

注:具体执行时间与测试数据有关!

4.替换

替换主要有 sub函数subn函数 ,他们功能类似!

先来看看 sub函数 的用法:

re.sub (pattern, repl, string, count=0, flags=0) 函数参数讲解:repl替换掉string中被pattern匹配的字符, count表示最大替换次数,flags表示正则表达式的常量。

值得注意的是: sub函数 中的入参: repl替换内容既可以是字符串,也可以是一个函数哦! 如果repl为函数时,只能有一个入参:Match匹配对象。

Python正则表达式,这一篇就够了

re.subn

(pattern, repl, string, count=0, flags=0)函数与 re.sub函数 功能一致,只不过返回一个元组 (字符串, 替换次数)。

Python正则表达式,这一篇就够了

5.编译正则对象

compile函数

template函数 将正则表达式的样式编译为一个 正则表达式对象 (正则对象Pattern),这个对象与re模块有同样的正则函数(后面我们会讲解Pattern正则对象)。

Python正则表达式,这一篇就够了

template函数compile函数 类似,只不过是增加了我们之前说的 re.TEMPLATE 模式,我们可以看看源码。

Python正则表达式,这一篇就够了

6.其他

re.escape(pattern) 可以转义正则表达式中具有特殊含义的字符,比如: . 或者 *

,举个实际的案例:

Python正则表达式,这一篇就够了

re.escape(pattern) 看似非常好用省去了我们自己加转义,但是使用它很容易出现转义错误的问题,所以并不建议使用它转义, 而建议大家自己手动转义

re.purge() 函数作用就是清除 正则表达式缓存

,具体有什么缓存呢?我们来看看源码就知道它背地里干了 什么:

Python正则表达式,这一篇就够了

看方法大概是清除缓存吧,我们再来看看具体的案例:

Python正则表达式,这一篇就够了

完整教学视频代码获取后台私信小编01即可

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多