整理下几个知识点, 方便自己后续查阅
模块
python2/python3,正则表达式模块名都是re
先介绍几个基本知识
. | 匹配任意除换行符"\n"外的字符(在DOTALL模式中也能匹配换行符) |
\ | 转义字符,使后一个字符改变原来的意思,如\s就是代表空白字符 |
* | 匹配多次,0-n次 |
+ | 匹配多次,1-n次,和*的区别,+至少要匹配一次 |
? | 匹配0次或1次 |
^ | 匹配字符串开头,在多行模式中匹配每一行的开头 |
$ | 匹配字符串末尾,在多行模式中匹配每一行的末尾 |
| | 或,如a|b,表示匹配a或b |
[...] | 用来表示一组字符,也能给出一个范围,单独列出,如[abcd]或[a-d],都是匹配'a' 或 'b' 或 'c' 或 'd' |
[^...] | 不在[]中的字符,如[^abc],匹配除了abc之外所有字符 |
(...) | 匹配括号里的一个表达式,也表示一个组 |
{n}/{n,m} | 里面是一个数字,表示匹配的次数,也可以写一个范围,如{1,3},匹配1到3次 |
{}? | 非贪婪模式,只会匹配最小次数,如{1,3}?,表示匹配一次 |
+? | 非贪婪模式,如<td>help</td>,<.+>,这样表达式会匹配全部;<.+?>,这样的表达式只会匹配第一个符合条件的<td> |
*? | 非贪婪模式,实例参考 +? |
?? | 非贪婪模式,因为?本身是匹配0次或1次,所以??就是匹配0次 |
\d | 匹配数字,就是0-9十个数字 |
\D | 匹配非数字 |
\s | 匹配空白字符,最常用的就是\t\n\r还有space |
\S | 匹配非空白字符 |
\w | 匹配字母数字字符,就是0-9十个数字和a-z 26个英文字母 |
\W | 匹配非字母数字字符 |
re.I | 忽略大小写 |
re.L | 做本地化识别(locale-aware)匹配 |
re.M | 多行匹配,影响 ^ 和 $ |
re.S | 改变.的匹配模式,使.能匹配包括\n在内的所有字符 |
re.U | 根据Unicode字符集解析字符。这个标志影响 \w, \W, \b, \B. |
re.X | 该标志通过给予你更灵活的格式以便你将正则表达式写得更易于理解。 |
(?<name>) |
给匹配到的分组定义一个别名,在使用groupdict()时,会返回一个字典,key就是name,value就是匹配到的值。 如hello world这样的一个字符串,用(?P<test1>\w+)\s(?P<test2>\w+)这个来匹配, |
\number |
引用标号为number的分组匹配到的字符串,如<td>1234<td>这样的一个字符串,(<.+?>)\d+\1这样就能匹配到 适用于匹配两头一样的字符串 |
(?=name) | 引用别名为name的分组匹配到的字符串,这个用法和 \number 很类似,表达式参考(?P<td>.+?)\d+(?P=td) |
(?:...) | 就是(...)的一个不分组的版本 |
(?iLmsux) |
其中iLmsux每个都代表一个匹配模式,只能用在正则表达式的开头,可同时使用多个; 这种模式,和re.I,re.L,re.M,re.S,re.U,re.X这种方式是等价的 |
(?#...) | #后面的内容将作为注释被忽略 |
(?=...) | 之后的字符串内容需要匹配表达式才能匹配成功,不消耗字符串内容,如a(?=\d),a后面的必须是数字才能匹配成功 |
(?!...) | 之后的字符串内容需要不匹配表达式才能匹配成功,不消耗字符串内容 |
(?<=...) | 之前的字符串内容需要匹配表达式才能匹配成功,不消耗字符串内容,如a(<=\d),a的前面是数字才能匹配成功 |
(?<!...) | 之前的字符串内容需要不匹配表达式才能匹配成功,不消耗字符串内容 |
还有比较特殊的,用的不多
(?(id/name)yes-pattern|no-pattern)
如果编号为id或别名为name的组匹配到字符,则需要匹配yes-pattern,否则需要匹配no-pattern,|no-pattern可省略