RE正则表达式20220423
关于re模块的常量、函数、异常我们都讲解完毕,但是完全有必要再讲讲正则对象Pattern。
1. 与re模块 函数一致
在re模块的函数中有一个重要的函数 compile函数 ,这个函数可以预编译返回一个正则对象,此正则对象拥有与re模块相同的函数,我们来看看Pattern类的源码。
既然是一致的,那到底该用re模块 还是 正则对象Pattern ?
而且,有些同学可能看过re模块的源码,你会发现其实compile函数 与 其他 re函数(search、split、sub等等) 内部调用的是同一个函数,最终还是调用正则对象的函数!
也就是说下面 两种代码写法 底层实现 其实是一致的:
# re函数
re.search(pattern, text)
# 正则对象函数
compile = re.compile(pattern)
compile.search(text)
那还有必要使用compile函数 得到正则对象再去调用 search函数 吗?直接调用re.search 是不是就可以?
2. 官方文档怎么说
关于到底该用re模块 还是 正则对象Pattern ,官方文档是否有说明呢?
官方文档推荐:在多次使用某个正则表达式时推荐使用正则对象Pattern 以增加复用性,因为通过 re.compile(pattern) 编译后的模块级函数会被缓存!
3. 实际测试又如何?
上面官方文档推荐我们在 多次使用某个正则表达式时使用正则对象,那实际情况真的是这样的吗?
我们在实测一下吧
猪哥编写了两个函数,一个使用re.search函数 另一个使用 compile.search函数 ,分别(不同时)循环执行count次(count从1-1万),比较两者的耗时!
得出的结果猪哥绘制成折线图:
得出的结论是:100次循环以内两者的速度基本一致,当超出100次后,使用 正则对象Pattern 的函数 耗时明显更短,所以比re模块 要快!
通过实际测试得知:Python 官方文档推荐 多次使用某个正则表达式时使用正则对象函数 基本属实!
注意事项
Python 正则表达式知识基本讲解完毕,最后稍微给大家提一提需要注意的点。
1.字节串 与 字符串
模式和被搜索的字符串既可以是 Unicode 字符串 (str) ,也可以是8位字节串 (bytes)。 但是,Unicode 字符串与8位字节串不能混用!
2.r 的作用
正则表达式使用反斜杠('')来表示特殊形式,或者把特殊字符转义成普通字符。
而反斜杠在普通的 Python 字符串里也有相同的作用,所以就产生了冲突。
解决办法是对于正则表达式样式使用 Python 的原始字符串表示法;在带有 'r' 前缀的字符串字面值中,反斜杠不必做任何特殊处理。
3.正则查找函数 返回匹配对象
查找一个匹配项(search、match、fullmatch)的函数返回值都是一个 匹配对象Match ,需要通过match.group() 获取匹配值,这个很容易忘记。
另外还需要注意:match.group() 与match.groups() 函数的差别!
4.重复使用某个正则
如果要重复使用某个正则表达式,推荐先使用 re.compile(pattern)函数 返回一个正则对象,然后复用这个正则对象,这样会更快!
浙公网安备 33010602011771号