python 正则使用详解
正则不是乱码,而是字符串的魔法咒语!比如想一键扒光HTML标签?用<[^<>]*?>
就能让代码“裸奔”。但小白常问:为啥我的正则总翻车?
问题1:匹配开头和全文怎么选?
你用re.match
就像拿着放大镜从门口查健康码——必须从头严查,而re.search
是满屋子找钥匙的熊孩子。比如查手机号时,re.fullmatch('1d{10}', '1380013800')
会暴怒:“少一位都不行!”
问题2:替换结果怎么追踪?
re.sub
像霸道总裁直接改合同,而subn
会贴心附赠修改次数小票。比如给古诗加弹幕:re.subn('。','!!!','白日依山尽')
返回('白日依山尽!!!',1)
彩蛋:为啥正则慢如蜗牛?
反复用re.findall('d+', text)
就像每次做菜现磨刀。用re.compile
预编译,等于提前磨好四十米大刀——下次直接砍!
记住:贪婪模式(.*)是吃货,非贪婪(.*?)是减肥达人。处理百万字小说时,finditer
比findall
更省内存,毕竟谁也不想让电脑表演内存爆炸艺术。
python 正则使用详解
- 什么是正则
- 在 python 中使用正则
-
- 一些正则的定义
- python 正则的方法
-
- match 从字符串开头匹配
-
- 正则返回的结果分析(重要)
- fullmatch 严格匹配整个字符串
- search 任意位置开始匹配
- sub 替换匹配内容
- subn 以元组方式返回替换结果
- split 正则切割
- findall 查找所有匹配结果
- finditer 返回一个迭代结果
- compile 正则表达式的预编译
- purge 清除缓存
- escape 正则表达式格式化
什么是正则
正则很简单的哦,不要因为看到和乱码差不多的样子就望而却步了,他很有规律的。
简单概括,就是用来描述字符串格式的,比如数字就可以是 [0-9],也可以是 [0123456789],还可以是 \\d
而日常我们使用正则,则就是用这个描述格式来验证或匹配提取或批量替换用的,比如 html 代码,用 <[^<>]*?> 来匹配或删除所有标签
关于正则的入门知识,可以围观一下老顾的文章《文盲的正则表达式入门》,在这个文章里,老顾以正则各种符号使用的场景用途做了区分,和其他正则入门的教程不一样哦,当然,也没那么完整就是了。这个文章主要是用来方便理解正则的。
在 python 中使用正则
大部分的开发语言中,都有对正则的支持,毕竟,这也是字符验证的一个主要流派了,甚至不少数据库、命令行都有正则的支持,比如 linux系统,比如 mysql、oracle 数据库等,所以正则还是有必要学一学的。
在 python 中,正则的内容则放在 re 这个包里,使用也很简单,只要引用这个包就可以了
import re
print(re.findall('\\d','123456 78/*9')) # 一个简单的例子,找出字符串中所有数字
在 python 的 re 包里,他提供了不少的指令,咱们来一一查看并学习,为了不遗漏内容,咱们把 re.py 这个文件打开,照着这个文档的内容来进行。文件位置如图,在 python 安装路径下的 lib 文件夹内。
一些正则的定义
在 re.py 这个文件中,从第29行开始,他简单的介绍了一些基本的特殊符号定义
The special characters are:
特殊字符为:"." Matches any character except a newline.匹配除换行符以外的任何字符。"^" Matches the start of the string.匹配字符串的开头。"$" Matches the end of the string or just before the newline at the end of the string.匹配字符串的末尾或位于的换行符之前新行的末端。"*" Matches 0 or more (greedy) repetitions of the preceding RE.Greedy means that it will match as many repetitions as possible.匹配0个或多个(默认是贪婪模式)由前边的正则片段定义的重复内容。贪婪模式意味着它会匹配尽可能多的重复。"+" Matches 1 or more (greedy) repetitions of the preceding RE.匹配1个或多个(默认是贪婪模式)由前边的正则片段定义的重复内容。"?" Matches 0 or 1 (greedy) of the preceding RE.匹配0个或1个(默认是贪婪模式)由前边的正则片段定义的内容。*?,+?,?? Non-greedy versions of the previous three special characters.前边三个定义的非贪婪版本。(老顾的正则入门里说过的哦,+*? 是长度定义,在长度定义后加 ? 就表示非贪婪模式,这个可以引用到任何长度定义中,包括下边也有出现){m,n} Matches from m to n repetitions of the preceding RE.匹配至少 m 个,最多 n 个由前边正则片段定义的内容。默认是贪婪模式{m,n}? Non-greedy version of the above.上边长度定义的非贪婪版本。"\\\\" Either escapes special characters or signals a special sequence.要么转义特殊字符,要么就是一个已经预定义的特殊序列。(好吧,老顾也不知道怎么准确翻译,这里的特殊序列指的就是预定义的字符集,比如\\d表示数字,\\n表示回车)[] Indicates a set of characters.A "^" as the first character indicates a complementing set.表示一组字符。(也就是老顾说的字符集,比如 \\d 是已经预定义好的,但是是全部数字,也许我们只需要123,不需要其他数字,那么就必须自己定义字符集 [123] 这个样子)作为第一个字符的“^”表示一个补集。(在字符集定义中,如果 ^ 是第一个字符,则表示这个是个补集,换个说法,就是不包含之后定义的字符集的其他字符集,比如 [^\\d] 就是所有非数字的字符)"|" A|B, creates an RE that will match either A or B.A|B,创建一个匹配A或B的正则片段。(...) Matches the RE inside the parentheses.The contents can be retrieved or matched later in the string.匹配括号内的正则片段。稍后可以在字符串中检索或匹配内容。(事实上,除了稍后在其他地方使用,在当前正则片段后的部分也可以使用)(?aiLmsux) The letters set the corresponding flags defined below.字母设置下面定义的相应标志。(这个用法老顾还没试过,翻译为百度翻译的结果)(?:...) Non-grouping version of regular parentheses.正则圆括号的非分组版本。(也就是不可引用、追溯的部分)(?P<name>...) The substring matched by the group is accessible by name.组匹配的子字符串可以通过名称访问。(给分组定个名字,然后通过名字访问)(?P=name) Matches the text matched earlier by the group named name.匹配前面由组名称匹配的文本。(?#...) A comment; ignored.一个注释,忽略掉。(嗯,我讨厌写注释)(?=...) Matches if ... matches next, but doesn't consume the string.右断言,位置修饰,如果能匹配成功则匹配之后的正则片段,该修饰不占用匹配空间。(?!...) Matches if ... doesn't match next.右断言,与上一个修饰意思相反,如果不符合之后的正则片段,则继续匹配。(?<=...) Matches if preceded by ... (must be fixed length).左断言,如果前边的字符符合正则片段...(必须定长)(?<!...) Matches if not preceded by ... (must be fixed length).左断言,如果前边的字符不符合正则片段...(必须定长)(?(id/name)yes|no) Matches yes pattern if the group with id/name matched, the (optional) no pattern otherwise.如果具有id/name的组匹配,则匹配yes模式,否则为(可选)无模式。(同样没用过的方法)
通过这个内容,我们基本就可以确定 python 中,正则能完成哪些描述,这样的描述又有什么样的限制了。
再之后,从62 行开始,还介绍了一些预定义字符集,这里就不翻译了,大家随便看看就好,基本都差不多。
再然后,87 行开始,说明了, re 这个包之中包含的各种方法,嗯,之后一一讲解
以及102行开始的,正则修饰。。。。老顾最常用的就是忽略大小写修饰,这个修饰是在正则定义之外的,还有多行匹配也偶尔用用,其他的说实话,老顾基本用不上。
python 正则的方法
约定,之后的所有内容,默认都已经引入了 re 包,即,代码中已经包含了 import re
match 从字符串开头匹配
Match a regular expression pattern to the beginning of a string.
将正则表达式模式与字符串的开头匹配。
语法:
match(pattern, string, flags=0)
match(正则表达式,匹配字符串,正则表达式修饰(默认为0))
需要注意,这个方法时严格从字符串开头进行匹配的,如果想在字符串中间找到匹配,不要用这个方法哦。
示例: