正则表达式
特殊符号和字符
纯手打,就当熟悉了。
使用则已匹配符号匹配多个正则表达式
表示择一匹配的管道符号(|),也就是键盘上的竖线,表示一个“从多个模式中选择其一”的操作。它用于分割不同的正则表达式。例如,在下面的表格中,左边是一些运用择一匹配的模式,右边是左边相应的模式所能匹配的字符。
| 正则表达式模式 | 匹配的字符串 | 
|---|---|
| at | home | 
| r2d2 | c3po | 
| bat | bet | 
匹配任意单个字符
**点号或者句号(.)**符号匹配除了换行符\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) | 
参考资料:Python核心编程(第3版)【美】Wesley Chun著 孙波翔 李斌 李晗 译(中国工信出版社、人民邮电出版社)
本文转载自: 掘金