正则表达式

为什么使用正则

正则表达式为高级的文本模式匹配、抽取、与/或文本形式的搜索和替换功能提供了基础。正则表达式是一些由字符和特殊符合组成的字符串,描述了模式的重复或表述多个字符。正则表达式能按照某种模式匹配一系列有相似特征的字符串。
Python通过标准库中的re模块来支持正则表达式。

元字符

元字符是一系列特殊符号和字符,正是它给予正则表达式强大的功能和灵活性。
常见正则表达式和特殊符号

元字符 描述 示例
literal 匹配文本字符串的字面值literal foo
re1|re2 匹配正则表达式re1或re2 foo|bar
. 匹配除\n外的任意字符 a.b
^ 匹配字符串起始部分 ^ab
$ 匹配字符串终止部分 ab$
* 匹配0次或多次前面出现的正则表达式 [A-Z]*
+ 匹配1次或多次前面出现的正则表达式 [A-Z]+
? 匹配0次或1次前面出现的正则表达式 ab?
{N} 匹配N次前面出现的正则表达式 [0-9]{2}
{M,N} 匹配M~N次前面出现的正则表达式 [0-9]{2,3}
[a-z] 匹配字符集中出现的任一字符 [ab]
[a-z] 匹配a~z范围中的任一字符 [a-z]
[^ab] 不匹配字符集中的字符,可以使用范围字符 [^ab]
(*|+|?|{})? 用于匹配上面频繁出现、重复出现符号的非贪婪版本(*、+、?、{}) .*?[a-z]
(…) 匹配封闭的正则表达式,然后另存为子组 ([0-9]{3})?,f(oo
\d 匹配十进制数字,相当于[0-9],与\D相反 ab\d
\w 匹配任意字母数字,相当于[A-Za-Z0-9],与、\W相反 [A-Za-z_]\w
\s 匹配任意空格字符,相当于[\n\t\r\v\f],与\S相反 of\sthe
\b 匹配单词边界,与\B相反 \bThe\b
\N 匹配以保存的子组N,参见(…) ab:\2
\c 逐字匹配任何特殊字符c,斜线是转义 ,
\A(\Z) 匹配字符串的起始(结束) \Acd
(?iLmsux) 在正则表达式中嵌入一个或多个特殊“标记”参数 (?x),(? im)
(?:…) 表示一个匹配不用保存的分组 (?:\w+\.)*
(?P…) 像一个仅由name标识而不是数字ID标识的正则分组匹配 (?P)
(?P=name) 在同一字符串中匹配由(?P<\name)分组的之前文本 (?P=data)
(?#…) 表示注释,所有内容都被忽略 (?#comment)
(?=…) 匹配条件是如果…出现在之后的位置,而不使用输入字符串;称作正向前视断言 (?=.com)
(?!…) 匹配条件是如果…不出现在之后的位置,而不使用输入字符串;称作负向前视断言 (?!.net)
(?<=…) 匹配条件是如果…出现在之前的位置,而不使用输入字符串;称作正向后视断言 (?<=800-)
(?<!…) 匹配条件是如果…不出现在之前的位置,而不使用输入字符串;称作负向后视断言 (?<!192\.168\.)
(?(id/name)Y|N) 如果分组所提供的id或者name(名称)存在,就返回正则表达式的条件匹配Y,如果不存在,就返回N; N是可选项

使用择一符号匹配多个正则表达式模式

表示择一匹配的是管道符(|),用于分割不同的正则表达式。也称作并(union)、逻辑或(OR)

使用闭包操作符是想存在性和频数匹配

星号将匹配其左边的正则表达式出现零次或多次的情况,该操作成为Kleene闭包;加号将匹配一次货多次出现的正则表达式,称为正闭包操作符。其他如问号匹配零次或一次,大括号匹配N次或一个范围。
如果问号紧跟在任何使用闭合操作符的匹配后面,将匹配尽可能少的次数,非贪婪匹配。
当模式匹配使用分组操作符时,正则表达式引擎将试图“吸收”匹配该模式的尽可能多的字符。这通常被叫做贪婪匹配。

正则表达式 匹配字符串
[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+(.\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匹配