根据正则表达式 – 语法 | 菜鸟教程 (runoob.com)[1] 描述:正则表达式 (regular expression) 描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。 借助正则表达式,我们可以用简单的字符组合,实现多个文本内容的表达:PY{:3}N可表示 PN PYN PYYN PYYYN # 1)选择 可以通过竖直分隔符用于选择,比如 boy|girl 匹配 boy 或 girl。 # 2)数量限定
* # 星号代表前面的字符可以不出现,也可以出现一次或者多次(0 次、或 1 次、或多次),# 例如,“0*42”可以匹配 42、042、0042、00042 等。? # 表示前面的字符最多出现一次(0 次或 1 次)+ # 表示前面的字符必须出现至少一次(1 次或多次)
此外,还有:
. 表示任何单个字符<br data-darkmode-color-16390684610124="rgb(161, 164, 176)" data-darkmode-original-color-16390684610124="#fff|rgb(89, 89, 89)|rgb(56, 58, 66)" data-darkmode-bgcolor-16390684610124="rgb(30, 30, 30)" data-darkmode-original-bgcolor-16390684610124="#fff|rgb(250, 250, 250)">{m},扩展前一个字符串m次;ab{2}c,表示abbc。<br data-darkmode-color-16390684610124="rgb(161, 164, 176)" data-darkmode-original-color-16390684610124="#fff|rgb(89, 89, 89)|rgb(56, 58, 66)" data-darkmode-bgcolor-16390684610124="rgb(30, 30, 30)" data-darkmode-original-bgcolor-16390684610124="#fff|rgb(250, 250, 250)">{m,n},扩展前一个字符串m 到n次;ab{1,2}c,表示abc,abbc。<br data-darkmode-color-16390684610124="rgb(161, 164, 176)" data-darkmode-original-color-16390684610124="#fff|rgb(89, 89, 89)|rgb(56, 58, 66)" data-darkmode-bgcolor-16390684610124="rgb(30, 30, 30)" data-darkmode-original-bgcolor-16390684610124="#fff|rgb(250, 250, 250)">
3)范围与优先级
()圆括号可以用来定义模式字符串的范围和优先级,这可以简单的理解为是否将括号内的模式串作为一个整体。例如,“gr(a|e)y” 等价于 “gray|grey”,(这里体现了优先级,竖直分隔符用于选择 a 或者 e 而不是 gra 和 ey),“(grand)?father” 匹配 father 和 grandfather(这里体现了范围,?将圆括号内容作为一个整体匹配)。 # 4)限定范围
[] 对单个字符给出取值范围;[abc]表示a或b或c,[a-f]表a-f中的任意一个字符串。[^ ],与[]相反,指取值范围以外字符;[^abc]表示非a非b非c。. 表示任何单个字符^,表示字符串开头部分;^abc,匹配abc 开头的字符串。$,匹配字符串结尾;abc$,匹配abc 结尾的字符串。
5)语法
由于正则表达式存在多种不同的语法(类似于方言的赶脚),而主要学习的是 PCRE 子集,其适用于 perl 和 python 编程语言及 grep 或 egrep 的正则表达式匹配规则。 > PCRE(Perl Compatible Regular Expressions 中文含义:perl 语言兼容正则表达式)是一个用 C 语言编写的正则表达式函数库,由菲利普. 海泽 (Philip Hazel) 编写。PCRE 是一个轻量级的函数库,比 Boost 之类的正则表达式库小得多。PCRE 十分易用,同时功能也很强大,性能超过了 POSIX 正则表达式库和一些经典的正则表达式库。
额外补充一些:
\d 数字,等价于[0-9]<br data-darkmode-color-16390684610124="rgb(161, 164, 176)" data-darkmode-original-color-16390684610124="#fff|rgb(89, 89, 89)|rgb(56, 58, 66)" data-darkmode-bgcolor-16390684610124="rgb(30, 30, 30)" data-darkmode-original-bgcolor-16390684610124="#fff|rgb(250, 250, 250)">\D 非数字。<br data-darkmode-color-16390684610124="rgb(161, 164, 176)" data-darkmode-original-color-16390684610124="#fff|rgb(89, 89, 89)|rgb(56, 58, 66)" data-darkmode-bgcolor-16390684610124="rgb(30, 30, 30)" data-darkmode-original-bgcolor-16390684610124="#fff|rgb(250, 250, 250)">\w 单词字符,等价于[A-Z], [a-z], [0-9] 及 -。<br data-darkmode-color-16390684610124="rgb(161, 164, 176)" data-darkmode-original-color-16390684610124="#fff|rgb(89, 89, 89)|rgb(56, 58, 66)" data-darkmode-bgcolor-16390684610124="rgb(30, 30, 30)" data-darkmode-original-bgcolor-16390684610124="#fff|rgb(250, 250, 250)">\W 非单词字符。<br data-darkmode-color-16390684610124="rgb(161, 164, 176)" data-darkmode-original-color-16390684610124="#fff|rgb(89, 89, 89)|rgb(56, 58, 66)" data-darkmode-bgcolor-16390684610124="rgb(30, 30, 30)" data-darkmode-original-bgcolor-16390684610124="#fff|rgb(250, 250, 250)">\t 制表符。<br data-darkmode-color-16390684610124="rgb(161, 164, 176)" data-darkmode-original-color-16390684610124="#fff|rgb(89, 89, 89)|rgb(56, 58, 66)" data-darkmode-bgcolor-16390684610124="rgb(30, 30, 30)" data-darkmode-original-bgcolor-16390684610124="#fff|rgb(250, 250, 250)">\n 空行。<br data-darkmode-color-16390684610124="rgb(161, 164, 176)" data-darkmode-original-color-16390684610124="#fff|rgb(89, 89, 89)|rgb(56, 58, 66)" data-darkmode-bgcolor-16390684610124="rgb(30, 30, 30)" data-darkmode-original-bgcolor-16390684610124="#fff|rgb(250, 250, 250)">\s 空格型内容,如\t, \n等。<br data-darkmode-color-16390684610124="rgb(161, 164, 176)" data-darkmode-original-color-16390684610124="#fff|rgb(89, 89, 89)|rgb(56, 58, 66)" data-darkmode-bgcolor-16390684610124="rgb(30, 30, 30)" data-darkmode-original-bgcolor-16390684610124="#fff|rgb(250, 250, 250)">\S 非空格。<br data-darkmode-color-16390684610124="rgb(161, 164, 176)" data-darkmode-original-color-16390684610124="#fff|rgb(89, 89, 89)|rgb(56, 58, 66)" data-darkmode-bgcolor-16390684610124="rgb(30, 30, 30)" data-darkmode-original-bgcolor-16390684610124="#fff|rgb(250, 250, 250)"><br data-darkmode-color-16390684610124="rgb(161, 164, 176)" data-darkmode-original-color-16390684610124="#fff|rgb(89, 89, 89)|rgb(56, 58, 66)" data-darkmode-bgcolor-16390684610124="rgb(30, 30, 30)" data-darkmode-original-bgcolor-16390684610124="#fff|rgb(250, 250, 250)">
优先级
image.png # 总结 实验楼真的很良心了:
小练习
第一题:
? 表 () 部分出现 0 或 1 次,因此对应字符串为 PN, PYN, PYTHN,PYTHON ## 第二题: PYTHON+可表示 PYTHON PYTHONN PYTHONNN … … ## 第三题: PY{:3}N可表示 PN PYN PYYN PYYYN ## 经典正则表达式 1)^[A-Za-z]+$,匹配开头结尾之间的,也就是任意数目的二十六个大小写字母组成的字符串。可以再加上数字,^[A-Za-z0-9]+$2)整数的字符串如何表示呢?^-?\d+$ ## 设计正则表达式 ### 匹配 IP 地址的正则 IP 地址分四段,每段为 0-255,比如111.111.111.111``(([1-9]?\d|1\d{2}|2[0-4]\d|25[0-5]).){3}([1-9]?\d|1\d{2}|2[0-4]\d|25[0-5]) 将每段 0-255 用分组标记及或字符,进行表达,包括 0-99|100-199|200-249|250-255,四段。将该分组再扩展为四段,其中前三段的末尾有. 。 # 学习资源 如果想要练习自己的正则表达式掌握情况,可以在这个网站进行练习:https://regex101.com/[2] 它不仅会检验你的正则在文字中的结果,并返回匹配的值:
还可以进行语法的检查:
如果你希望将正则使用的代码保存,也支持多种语法的输出:
但缺点是这个网站对于境内用户不是很友好,还有另外一个可以满足正则检查基本功能的网站:https://tool.oschina.net/regex/#[3] 它也提供了一些常用正则表达式的语法,可以结合使用。
参考资料
[1] 正则表达式 – 语法 | 菜鸟教程 (runoob.com): https://www.runoob.com/regexp/regexp-syntax.html [2] https://regex101.com/: https://regex101.com/ [3] https://tool.oschina.net/regex/#: https://tool.oschina.net/regex/# > 本文由简悦 SimpRead 转码