小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
本文已参与 「掘力星计划」 ,赢取创作大礼包,挑战创作激励金。
前言
在日常生活中我们是否出现以下场景:
-
对于刚接手的项目时,通常我们会先熟悉项目,找到对接的相关方后,才能顺利开展后续工作
-
对于交朋友时,我们会与朋友们之间,磨合熟悉后,杆把子、好哥们等就出现啦
-
对于在商场购物时,我们会根据自己的需求在众多商品中,找到中意的物品,开心地完成购物
-
等等,在日常中,关于筛选检查的场景中,我们都离不开匹配的动作
除了在日常生活中,我们大量使用匹配的原则外,那么我们在工作场景中,也存在大量的匹配筛选的场景
匹配筛选目前适用场景主要分为:静态文本、动态文本
- 静态文本:典型操作-ctrl+f
- 动态文本:正则
本期,我们来对正则表达式进行系统了解和学习,Let‘s go~
1. 正则介绍
正则表达式(Regular Expression 简写regex)是一种用于字符串匹配模式,通过定义一串特殊规则去匹配符合的字符。
正则表达式起源
- 20世纪40年代:起源于数学方式的神经网络模型
- 1956年:诞生“正则表达式”术语
- 1968年:UNIX之父研发出正则表达式流派之一,支持正则表达式编译器qed
- 1987年:正则表达式流派之一,Perl语言诞生.众多语言都是参考prel语言正则表示
正则表达式特点:
- 多语言支持:目前Javascript、C#、Python、PHP都有支持正则表达式的接口
- 通用性好:定义统一的规则语法,简单易学易用,能快速运用上手
- 应用广泛:文本匹配查找、数据抓去、网络爬虫、数据校验等等
- 模式多样:规则灵活多变,常见的有贪婪模式与非贪婪模式
正则表达式常用的网站
2. 正则规则
正则表达式规则主要由五个方面组成
- 预定义字符
预定义字符 | 说明 |
---|---|
. | 默认可匹配除换行符之外的任意字符 |
\d | 匹配0~9的所有数字 |
\D | 匹配非数字 |
\s | 匹配所有的空白字符,包括空格、制表符、回车符、换页符等 |
\S | 匹配所有非空白字符 |
\w | 匹配所有的单词字符包括0~9数字、26个英语字符和下划线(_) |
\W | 匹配所有非单词字符 |
- 特殊字符
特殊字符 | 说明 | |
---|---|---|
() | 标记子表达式的开始位置和结束位置 | |
[] | 用于确定中括号表达式的开始位置和结束位置 | |
{} | 用于标记前面子表达式的出现频度 | |
* | 指定前面子表达式可以出现零次或多次 | |
+ | 指定前面子表达式可以出现一次或者多次 | |
? | 指定前面子表达式可以出现零次或者一次 | |
. | 匹配除换行符\n之外的任意单个字符 | |
\ | 用于转义一个字符 | |
指定在两项之间任选一项 |
-
合法字符
字符 说明 X 字符x(x可代表任意合法的字符) \uhhhh 十六进制0xhhhh所表达Unicode字符 \t 制表符 \n 换行符 \r 回车符 \f 换页符 \a 报警(bell)符 \e Escape字符 \cx x 对应的控制符 -
边界匹配符
边界匹配符 说明 ^ 行的开头 $ 行的结尾 \b 单词的边界。即只能匹配单词前后的空白 \B 非单词的边界,即只能匹配不在单词前后的空白 \A 只匹配字符串的开头 \Z 只匹配字符串的结尾,仅拥用于最后的结束符 -
区间
方括号表达式 说明 [0-9] 表示0~9任意数字 [a-z] 表示a~z任意字母 [adcd] 表示a,d,c,d其中任意一个字符 [^adc] 表示非a,b,c的任意字符
3. 正则引擎
正则引擎主要可以分三大类:
引擎名称 | 程序 | 匹配特点 |
---|---|---|
NFA | .Net,PHP,Java等 | 回溯,最左匹配 |
POSIX NFA | mawk | 最长匹配 |
DFA | egrep,awk等 | 最长匹配,不支持回溯、捕获、忽略优先量词 |
- DFA:(确定型有穷自动机),采用文本导向(text- directed)
- NFA:(非确定型有穷自动机),采用正则导向(regex-directed)
DFA 与 NFA 的特点:
-
相同点:
- 都是从左到右开始进行匹配
- 量词(*,+,{})不加?的时候被忽略,默认匹配有优先
-
异同点:
-
DFA:文本导向
- 不支持回溯和捕获,匹配时以目标字符为导向
- 匹配之前,系统会对字符串进行分析和理解
- 匹配时,系统会对目标字符串从左到右进行扫描一次,同时尝试匹配多个分支,依次淘汰,无需再对目标字符串进行回溯
- 最后返回结果是一个目标字符串里面的最长匹配
我们来看一下,DFA引擎的工作原理流程:
-
NFA:字符回溯
- 对目标字符串支持回溯和捕获
- 匹配时,以遍历的方式进行匹配
- 先尝试第一个分支进行匹配,如果匹配成功,则结束匹配,返回匹配结果
- 如果匹配不成功,则继续进行下一个分支匹配( NFA 回溯功能)
*我们来看一下,NFA引擎的工作原理流程:
-
DFA 与 NFA 优缺点对比:
引擎 | 功能 | 速度 | 编译 | 使用者 |
---|---|---|---|---|
DFA | 少 | 快 | 预编译:优化效果显著;编译:内存大且慢 | MYSQL、flex |
NFA | 多 | 慢 | 预编译:优化复杂;编译:内存占比小且快 | PHP,JAVA、Python等 | |
4. 正则优化
我们大多数语言正则表达式都是使用NFA引擎的。经过上面的学习,我们知道NFA匹配查询比较慢,因此在日常工作使用时,我们可以根据以下方面进行优化使用:
-
表达式本身优化:
- 使用字符串代替分支条件
- 优先选择最左端的匹配结果
- 谨慎使用+、*等量词
- 尽量使用字符串函数进替代
- 起始、行描点优化
- 量词等价转换的效率差异
- 合理使用括号
-
其他方面
- 代码编译缓存
- 预检查字符串长度
- 代码循环尽量避免使用正则
总结
本期,我们主要对正则表达式语法进行全面的了解和掌握,同时也对正则使用的引擎工作流程进行介绍。
正则表达式以语法简单、上手快的优势,能快速为我们替代一些日常复杂的查询检查步骤。
正所谓,一日练,一日功,一日不练十日空,大家平时多多使用起来~
以上是本期内容,欢迎大佬们评论点赞,我们下次见~
今天的文章【小知识】Python 正则表达式语法分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/17092.html