正则表达式模式(特殊符号和字符)
正则表达式
特殊符号和字符
纯手打,就当熟悉了。
使用则已匹配符号匹配多个正则表达式
表示择一匹配的管道符号(|),也就是键盘上的竖线,表示一个“从多个模式中选择其一”的操作。它用于分割不同的正则表达式。例如,在下面的表格中,左边是一些运用择一匹配的模式,右边是左边相应的模式所能匹配的字符。
正则表达式模式 | 匹配的字符串 |
---|---|
at | home | at、home |
r2d2 | c3po | r2d2、c3po |
bat | bet | bit | bat、bet、bit |
匹配任意单个字符
**点号或者句号(.)**符号匹配除了换行符\n以外的任何字符(Python正则表达式有一个编译标记[S或者BOTALL],该标记能够推翻这个限制,使点号能够匹配换行符)。无论字母、数字、空格(并不包括“\n”换行符)、可打印字符、不可打印字符、不可打印字符,还是一个符号,使用点号都能够匹配它们。
正则表达式模式 | 匹配的字符串 |
---|---|
f.o | 匹配在字母“f”和“o"之间的任意一个字符:例如fao、f9o、f#o |
.. | 任意两个字符 |
.end | 匹配在字符串end之前的任意一个字符 |
从字符串起始或者结尾或者单词边界匹配
如果要匹配字符串的开始位置,就必须使用脱字符(^)或者特殊字符\A(反斜线和大写字母A)。同样,美元符号($)或者\Z将用于匹配字符串的末尾位置。
正则表达式模式 | 匹配的字符串 |
---|---|
^From | 任何以From作为起始的字符串 |
/bin/tcsh$ | 任何以/bin/tcsh作为结尾的字符串 |
^Subject:hi$ | 任何由单独的字符串Subject:hi构成的字符串 |
正则表达式模式 | 匹配的字符串 |
---|---|
the | 任何包含the的字符串 |
\bthe | 任何以the开始的字符串 |
\bthe\b | 仅仅匹配单词the |
\Bthe | 任何包含但并不以the作为起始的字符串 |
如果想要逐字匹配这些字符中的任何一个(或者全部),就必须使用反斜线进行转义。例如,如果你想要匹配任何以美元符号结尾的字符串,一个可行的正则表达式方案就是使用模式.*\$$。
特殊字符\b和\B可以用来匹配字符边界。
创建字符集
该正则表达式能够匹配一对方括号中包含的任何字符。下面为一些示例。
正则表达式模式 | 匹配的字符串 |
---|---|
b[aeiu]t | bat、bet、bit、but |
[cr] [23] [dp] [o2] | 一个包含四个字符的字符串,第一个字符是“c"或“r”,然后是“2”或“3”,后面是“d”或“p”,最后要么是“o”要么是“2”。例如,c2do、r3p2、r2d2、c3po等 |
限定范围和否定
除了单字符以外,字符集还支持匹配指定的字符范围。方括号中两个符号中间用连字符(-)连接,用于指定一个字符的范围;例如,A-Z、a-z或者0-9分别用于表示大写字母、小写字母和数值数字。
正则表达式模式 | 匹配的字符串 |
---|---|
z.[0-9] | 字母“z”后面跟着任何一个字符,然后跟着一个数字 |
[r-u] [env-y] [us] | 字母“r”,“s”,“t”或者“u”后面跟着“e”、“n”、“v”、“w”、“x”或者“y”,然后跟着“u"或者“s” |
[^aeiou] | 一个非元音字符 |
[^\t\n] | 不匹配制表符或者\n |
[“-a] | 在一个ASCII系统中,所有字符都位于“”和“a”之间,即34-97之间 |
使用闭包操作符实现存在性和频数匹配
**加号(+)**操作符将匹配一次或者多次出现的正则表达式(也叫做正闭包操作符),**问号(?)**操作符将匹配零次或者一次出现的正则表达式。
正则表达式模式 | 匹配的字符串 |
---|---|
[dn]ot? | 字母“d”或者“n”,后面跟着一个“o”,然后是最多一个“t”,例如,do、no、dot、not |
0?[1-9] | 任何数值数字,它可能前置一个“0”,例如,匹配一系列数(表示从1~9月的数值),不管是一个还是两个数字 |
[0-9]{15,16} | 匹配15或者16个数字 |
</? [ ^ >]+> | 匹配全部有效的(和无效的)HTML标签 |
[KQRBNP] [a-h] [1-8]-[a-h] [1-8] | 在“长代数”标记法,表示国际象棋合法的棋盘移动(仅移动,不包括吃子和将军)。即“K”、“Q”、“R”、“B”、“N”或“P”等字母后面加上“a1”~“h8”之间的棋盘坐标。前面的坐标表示从哪里开始走棋,后面的坐标代表走到哪个位置(空格)上 |
表示字符集的特殊字符
d表示匹配任何十进制数字。另一个特殊字符(\w)能够用于表示全部字母数字的字符集,\s可以用来表示空格字符。\D表示任何非十进制数。
正则表达式模式 | 匹配的字符串 |
---|---|
\w+-\d+ | 一个由字母数字组成的字符串和一串由一个连字符分隔的数字 |
[A-Za-z]\w* | 第一个字符是字母;其余字符(如果存在)可以是字母或者数字(几乎等价于Python中的有效标识符) |
\d{3}-\d{3}-\d{4} | 美国电话号码的格式,前面是区号前缀,例如800-555-1212 |
\w+@\w+\ .com | 以XXX@YYY.com格式表示的简单电子邮件地址 |
使用圆括号指定分组
一对圆括号可以实现以下任意一个(或者两个)功能:
·对正则表达式进行分组;
·匹配子组。
正则表达式模式 | 匹配的字符串 |
---|---|
\d+(\.\d*) | 表示简单浮点数的字符串;也就是说,任何十进制数字,后面可以接一个小数点和零个或者多个十进制数字,例如“0.004”、“2”、“75.”等 |
(Mr?s?\.)?[A-Z] [a-z]*[A-Za-z-]+ | 名字和姓氏,以及对名字的限制(如果有,首字母必须大写,后续字母小写),全名前可以有可选的“Mr."、“Mrs.”、“Ms.”或者“M.”作为称谓,以及灵活可选的姓氏,可以有多个单词、横线以及大写字母 |
扩展表示法
以问号开始(?...)
正则表达式模式 | 匹配的字符串 |
---|---|
(?:\w+\.)* | 以句点作为结尾的字符串,例如“google.”、“twitter.”、“facebook.”,但是这些匹配不会保存下来供后续的使用和数据检索 |
(?#comment) | 此处并不做匹配,只是作为注释 |
(?=.com) | 如果一个字符串后面跟着“.com”才做匹配操作,并不使用任何目标字符串 |
(?!.net) | 如果一个字符串后面不是跟着“.net”才做匹配操作 |
(?<=800-) | 如果字符串之前为“800-”才做匹配,假定为电话号码,同样,并不使用任何输入字符串 |
(?<!192\.168\.) | 如果一个字符串之前不是“192.168.”才做匹配操作,假定用于过滤掉一组C类IP地址 |
(?(1)y|x) | 如果一个匹配组1(\1)存在,就与y匹配;否则,就与x匹配 |
参考资料:Python核心编程(第3版)【美】Wesley Chun著 孙波翔 李斌 李晗 译(中国工信出版社、人民邮电出版社)
转载自:https://juejin.cn/post/6941639472396107784