文章插图
![python正则表达式应用举例 正则表达式测试工具代码](http://img.hubeilong.com/220621/21330V438-0.jpg)
文章插图
大多数编程语言的正则表达式设计都师从Perl,所以语法基本相似,不同的是每种语言都有自己的函数去支持正则,今天我们就来学习 Python中关于 正则表达式的函数 。
注:为避免出现代码格式错乱,猪哥尽量使用代码截图演示哦 。
聊到Python正则表达式的支持,首先肯定会想到
re
库,这是一个Python处理文本的标准库 。标准库的意思表示这是一个Python内置模块,不需要额外下载,目前Python内置模块大概有300个 。可以在这里查看Python所有的内置模块:https://docs.python.org/3/py-modindex.html#cap-r因为re是内置模块,所以不需要再下载,使用时直接引入即可:
import re
re模块官方文档:https://docs.python.org/zh-cn/3.8/library/re.htmlre模块库源码:https://github.com/python/cpython/blob/3.8/Lib/re.py
常量即表示不可更改的变量,一般用于做标记 。
re模块中有9个常量,常量的值都是int类型!
1. IGNORECASE
语法:re.IGNORECASE 或简写为 re.I
作用:进行忽略大小写匹配 。
代码案例:
2. ASCII
语法:re.ASCII 或简写为 re.A
作用:顾名思义,ASCII表示ASCII码的意思,让
w
,W
,b
,B
,d
,D
,s
和S
只匹配ASCII,而不是Unicode 。代码案例:
w+
匹配到了所有字符串,而在ASCII模式下,只匹配到了a、b、c(ASCII编码支持的字符) 。注意:这只对字符串匹配模式有效,对字节匹配模式无效 。
3. DOTALL
语法:re.DOTALL 或简写为 re.S
作用:DOT表示
.
,ALL表示所有,连起来就是.
匹配所有,包括换行符n
。默认模式下.
是不能匹配行符n
的 。代码案例:
.
并没有匹配换行符n
,而是将字符串分开匹配;而在re.DOTALL模式下,换行符n
与字符串一起被匹配到 。注意:默认匹配模式下
.
并不会匹配换行符n
。4. MULTILINE
语法:re.MULTILINE 或简写为 re.M
作用:多行模式,当某字符串中有换行符
n
,默认模式下是不支持换行符特性的,比如:行开头 和 行结尾,而多行模式下是支持匹配行开头的 。代码案例:
^
表示匹配行的开头,默认模式下它只能匹配字符串的开头;而在多行模式下,它还可以匹配 换行符n
后面的字符 。注意:正则语法中
^
匹配行开头、A
匹配字符串开头,单行模式下它两效果一致,多行模式下A
不能识别n
。5. VERBOSE
语法:re.VERBOSE 或简写为 re.X
作用:详细模式,可以在正则表达式中加注解!
代码案例:
当一个正则表达式十分复杂的时候,详细模式或许能为你提供另一种注释方式,但它不应该成为炫技的手段,建议谨慎考虑后使用!
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信息 。
代码案例:
9.TEMPLATE
语法:re.TEMPLATE 或简写为 re.T
作用:猪哥也没搞懂TEMPLATE的具体用处,源码注释中写着:disable backtracking(禁用回溯),有了解的同学可以留言告知!
9个常量中,前5个(IGNORECASE、ASCII、DOTALL、MULTILINE、VERBOSE)有用处,两个(LOCALE、UNICODE)官方不建议使用、两个(TEMPLATE、DEBUG)试验性功能,不能依赖 。
常量在re常用函数中都可以使用,查看源码可得知 。
|
符号,请勿使用+
符号!re模块有12个函数,猪哥将以功能分类来讲解;这样更具有比较性,同时也方便记忆 。
1.查找一个匹配项
查找并返回一个匹配项的函数有3个:search、match、fullmatch,他们的区别分别是:
search: 查找任意位置的匹配项match: 必须从字符串开头匹配fullmatch: 整个字符串与正则完全匹配
我们再来根据实际的代码案例比较:
案例1:
而match函数是要从头开始匹配,而字符串开头多了个字母
a
,所以无法匹配,fullmatch函数需要完全相同,故也不匹配!案例2:
案例3:
完整案例:
2.查找多个匹配项
讲完查找一项,现在来看看查找多项吧,查找多项函数主要有:findall函数与finditer函数:
findall: 从字符串任意位置查找,返回一个列表finditer:从字符串任意位置查找,返回一个迭代器
两个方法基本类似,只不过一个是返回列表,一个是返回迭代器 。我们知道列表是一次性生成在内存中,而迭代器是需要使用时一点一点生成出来的,内存使用更优 。
3.分割
re.split(pattern, string, maxsplit=0, flags=0)函数:用pattern分开 string ,maxsplit表示最多进行分割次数,flags表示模式,就是上面我们讲解的常量!
关于二者的速度如何? 猪哥实际测试了一下,在相同数据量的情况下使用
re.split
函数与str.split
函数执行次数与执行时间对比图: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匹配对象 。
compile函数 与 template函数将正则表达式的样式编译为一个 正则表达式对象 (正则对象Pattern),这个对象与re模块有同样的正则函数(后面我们会讲解Pattern正则对象) 。
re.escape(pattern) 可以转义正则表达式中具有特殊含义的字符,比如:
.
或者*
,举个实际的案例:re.purge 函数作用就是清除 正则表达式缓存,具体有什么缓存呢?我们来看看源码就知道它背地里干了 什么:
同样,最后来一张思维导图总结一下re模块中的函数吧,需要高清图或者xmind文件的同学可在末尾获取 。
re模块还包含了一个正则表达式的编译错误,当我们给出的正则表达式是一个无效的表达式(就是表达式本身有问题)时,就会raise一个异常!
我们来看看具体的案例吧:
注意:这个异常一定是 正则表达式 本身是无效的,与要匹配的字符串无关!
关于
re
模块的常量、函数、异常我们都讲解完毕,但是完全有必要再讲讲正则对象Pattern 。1. 与re模块 函数一致
在
re
模块的函数中有一个重要的函数compile函数,这个函数可以预编译返回一个正则对象,此正则对象拥有与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,官方文档是否有说明呢?
3. 实际测试又如何?
上面官方文档推荐我们在 多次使用某个正则表达式时使用正则对象,那实际情况真的是这样的吗?
我们再实测一下吧
得出的结果猪哥绘制成折线图:
通过实际测试得知:Python 官方文档推荐 多次使用某个正则表达式时使用正则对象函数 基本属实!
注意事项
Python 正则表达式知识基本讲解完毕,最后稍微给大家提一提需要注意的点 。
1.字节串 与 字符串
模式和被搜索的字符串既可以是 Unicode 字符串 (str) ,也可以是8位字节串 (bytes) 。但是,Unicode 字符串与8位字节串不能混用!
2.r 的作用
正则表达式使用反斜杠(’’)来表示特殊形式,或者把特殊字符转义成普通字符 。
而反斜杠在普通的 Python 字符串里也有相同的作用,所以就产生了冲突 。
解决办法是对于正则表达式样式使用 Python 的原始字符串表示法;在带有 ‘r’ 前缀的字符串字面值中,反斜杠不必做任何特殊处理 。
3.正则查找函数 返回匹配对象
查找一个匹配项(search、match、fullmatch)的函数返回值都是一个 匹配对象Match,需要通过match.group获取匹配值,这个很容易忘记 。
4.重复使用某个正则
如果要重复使用某个正则表达式,推荐先使用 re.compile(pattern)函数返回一个正则对象,然后复用这个正则对象,这样会更快!
5.Python 正则面试
【python正则表达式应用举例 正则表达式测试工具代码】笔试可能会遇到需要使用Python正则表达式,不过不会太难的,大家只要记住那几个方法的区别,会正确使用,基本问题不大 。
- 【君子不邢则不发.意思是不是说相形的五行要是吉神,如正官正印正则或相邢的五行?】正官合身坐禄用神
- Python适合高中生学习吗?扶对于面相就业这种情况【python面向对象三大特性】
- 上古密约侯正则是妖吗,侯正则结局是怎样的
- 打开cmd,如何用cmd打开python文件
- “c 面相对象调用“python,c,c的区别
- 光合作用的化学式表达式_光合作用的化学反应表达式
- Python适合高中生学习吗?扶对于面相就业这种情况 python 面相对象 选课系统
- p语言是python吗_python中是什么意思