概述
- 正则表达式,Regular Expression,缩写为regex、regexp、RE等。
- 正则表达式是文本处理极为重要的技术,用它可以对字符串按照某种规则进行检索、替换。
- 1970年代,Unix之父Ken Thompson将正则表达式引入到Unix中文本编辑器ed和grep命令中,由此正则表达式普及开来。
- 1980年后,perl语言对Henry Spencer编写的库,扩展了很多新的特性。1997年开始,Philip Hazel开发出了PCRE(Perl Compatible Regular Expressions),它被PHP和HTTPD等工具采用。
- 正则表达式应用极其广泛,shell中处理文本的命令、各种高级编程语言都支持正则表达式。
- 参考:https://www.w3cschool.cn/regex_rmjc/
分类
BRE
- 基本正则表达式,grep、sed、vi等软件支持。vim有扩展
ERE
- 扩展正则表达式,egrep(gerp -E)、sed -r等
PCRE
- 几乎所有高级语言都是PCRE的方言或者变种,Python从1.6开始就使用SRE正则表达式引擎,可以认为是PCRE的子集,见模块re
基本语法
元字符 metacharacter
转义
- 凡是在正则表达式中有特殊意义的符号,如果想使用它的本意,需使用\转义
- 反斜杠自身,得使用\
- \r,\n代表回车、换行
重复
练习
- 1、匹配手机号码
字符串为“手机号码13899879021” - 2、匹配中国坐骑
字符串为“号码027-65666837、0543-5837291” - 代码实现
- 1、\d{11}
- 2、\d{3,5}-\d{7,8}
or匹配与分组
- 注意:
分组和捕获是同一个意思
使用正则表达式,能用简单表达式,就不要复杂的表达式
零宽度断言
- 注意:
断言不占分组号。断言如同条件,只是要求匹配必须满足断言的条件
注释
贪婪与非贪婪
- 默认是贪婪模式,也就是说尽量多匹配更长的字符串
- 非贪婪很简单,在重复的符号后面加上一个?问号,就尽量的少匹配了
引擎选项
工作模式
单行模式
- . 点号可以匹配所有字符,包括换行符
- ^ 表示整个字符串的开头
- $ 表示整个字符串的结尾
多行模式
- . 点号可以匹配除了换行符之外的字符,多行不影响 . 点号
- ^ 表示行首,$ 表示行尾,不过这里的行是每一行
默认模式
- 可以看做待匹配的文本是一行,不能看做多行
- . 点号不能匹配换行符
- ^ 和 $ 表示行首和行尾,而行首行尾就是整个字符串的开头和结尾
总结
- 简单讲,单行模式只影响 . 点号行为,多行模式重新定义行影响了 ^ 和 $
- 字符串看不见的换行符,\r\n会影响e$的测试,e$ 只能匹配e\n
举例
very very happy
harry key
- 上面2行happy之后,有可能是\r\n结尾
- y$ 单行匹配key的y,多行匹配happy和key的y(这里的匹配是全局匹配)
- .$ 指的是此行的结尾,而默认模式和单行模式都是一行,指的是这个大字符串的最后一个字符,就是key的y