【小知识】Python 正则表达式语法

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

本文已参与 「掘力星计划」 ,赢取创作大礼包,挑战创作激励金。

前言

在日常生活中我们是否出现以下场景:

  • 对于刚接手的项目时,通常我们会先熟悉项目,找到对接的相关方后,才能顺利开展后续工作

  • 对于交朋友时,我们会与朋友们之间,磨合熟悉后,杆把子、好哥们等就出现啦

  • 对于在商场购物时,我们会根据自己的需求在众多商品中,找到中意的物品,开心地完成购物

  • 等等,在日常中,关于筛选检查的场景中,我们都离不开匹配的动作

除了在日常生活中,我们大量使用匹配的原则外,那么我们在工作场景中,也存在大量的匹配筛选的场景

匹配筛选目前适用场景主要分为:静态文本、动态文本

  • 静态文本:典型操作-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 的特点:

  • 相同点:

    1. 都是从左到右开始进行匹配
    2. 量词(*,+,{})不加?的时候被忽略,默认匹配有优先
  • 异同点:

    • DFA:文本导向

      1. 不支持回溯和捕获,匹配时以目标字符为导向
      2. 匹配之前,系统会对字符串进行分析和理解
      3. 匹配时,系统会对目标字符串从左到右进行扫描一次,同时尝试匹配多个分支,依次淘汰,无需再对目标字符串进行回溯
      4. 最后返回结果是一个目标字符串里面的最长匹配

      我们来看一下,DFA引擎的工作原理流程:

    • NFA:字符回溯

      1. 对目标字符串支持回溯和捕获
      2. 匹配时,以遍历的方式进行匹配
      3. 先尝试第一个分支进行匹配,如果匹配成功,则结束匹配,返回匹配结果
      4. 如果匹配不成功,则继续进行下一个分支匹配( NFA 回溯功能)

      *我们来看一下,NFA引擎的工作原理流程:

DFA 与 NFA 优缺点对比:

引擎 功能 速度 编译 使用者
DFA 预编译:优化效果显著;编译:内存大且慢 MYSQL、flex
NFA 预编译:优化复杂;编译:内存占比小且快 PHP,JAVA、Python等 |

4. 正则优化

我们大多数语言正则表达式都是使用NFA引擎的。经过上面的学习,我们知道NFA匹配查询比较慢,因此在日常工作使用时,我们可以根据以下方面进行优化使用:

  • 表达式本身优化:

    1. 使用字符串代替分支条件
    2. 优先选择最左端的匹配结果
    3. 谨慎使用+、*等量词
    4. 尽量使用字符串函数进替代
    5. 起始、行描点优化
    6. 量词等价转换的效率差异
    7. 合理使用括号
  • 其他方面

    1. 代码编译缓存
    2. 预检查字符串长度
    3. 代码循环尽量避免使用正则

总结

本期,我们主要对正则表达式语法进行全面的了解和掌握,同时也对正则使用的引擎工作流程进行介绍。

正则表达式以语法简单、上手快的优势,能快速为我们替代一些日常复杂的查询检查步骤。

正所谓,一日练,一日功,一日不练十日空,大家平时多多使用起来~

以上是本期内容,欢迎大佬们评论点赞,我们下次见~

猜你喜欢

转载自juejin.im/post/7014443984063823879