一、正则表达式
1. 字符
语法 | 说明 | 表达式 | 匹配结果 |
---|---|---|---|
一般字符 | 原文匹配,自己匹配自己 | love中国 | love中国 |
. | 匹配换行符“\n”之外的任意字符,DOTALL模式则没限制 | a.g | aeg |
\ | 转义字符,使后一个字符改变原来的意思 | a\.g a\\g | a.g a\g |
[ ] | 字符集/类,字符可以逐个列出,连续字符可以简写,如abcd写成a-d,第一个字符前加^表示取反,如[^abd]表示去匹配abc之外的字符,所有特殊字符在[ ]失去特殊含义,若用-、]或^前面要加反斜杠或把]、-放在第一位,^放在非第一位 | a[bd.g]e | abe a.e age |
2.预定义字符集(可写在 [ ] 中)
语法 | 说明 | 表达式 | 匹配结果 |
---|---|---|---|
\d | 数字:[0-9] | a\dg | a8g |
\D | 非数字:[^\d] | a\Dg | a哈g |
\s | 空白字符:[<空格>\t\r\n\f\v] | a\sg | a g |
\S | 非空白字符:[^\S] | a\Sg | adg |
\w | 单词字符:[A-Za-z0-9_] | a\wc | afg |
\W | 非单词字符:[^\W] | a\Wg | a g |
2.数量词(在字符或 ( ) 之后)
语法 | 说明 | 表达式 | 匹配结果 |
---|---|---|---|
* | 匹配前一个字符0次或无限次 | adg* | ad adgggg |
+ | 匹配前一个字符1次或无限次 | adg+ | adg adggg |
? | 匹配前一个字符0次或1次 | adg? | ad adg |
{m} | 匹配前一个字符m次 | ad{3}g | adddg |
{m,n} | 匹配前一个字符m到n次 | ad{2,3}g | addg adddg |
*? +? ?? {m.n}? | 使 * + ? {m,n} 变成非贪婪模式 |
3.边界匹配
语法 | 说明 | 表达式 | 匹配结果 |
---|---|---|---|
^ | 匹配字符串开头。在多行模式中匹配每一行的开头 | ^adg | adg |
$ | 匹配字符串末尾。在多行模式中匹配每一行的末尾 | adg$ | adg |
\A | 仅匹配字符串开头 | \Aadg | adg |
\Z | 仅匹配字符串末尾 | adg\Z | adg |
\b | 单词边界,零宽断言,只匹配一个单词的开始位置或者结束位置。单词是由字母或者数字构成的序列,由空格或者非字母数字字符作为结束标志。如 class 作为单独的一个完整单词的时候才会被匹配,当 class 是其他单词的一部分时不会被匹配 | a\b!dg | a!dg |
\B | [^\b],匹配非单词边界 | a\Bdg | adg |
4.逻辑、分组
语法 | 说明 | 表达式 | 匹配结果 |
---|---|---|---|
| | 左右表达式任意匹配一个。先左后右,左匹配则跳过右。若 | 不在 ( ) 中,则它的范围是整个正则表达式。如果需要匹配字符‘|’,使用 \|,或者将它放在一个字符类中[|]。 | adg | 123 |
( ) | 被括起来的表达式将作为分组,从左开始每遇到一个分组的左括号’(',编号+1。分组表达式作为一个整体,可以后接数量词,表达式中的 | 仅在该组中有效 | (adg){2} e(qwe | 123)c |
(?P<name>…) | 分组,除了原有编号外再起个别名 | (?P<id>adg) | adgadg |
\<number> | 应用编号为<number>的分组匹配到的字符串 | (\d)adg\1 | 1adg1 3adg3 |
(?P=name) | 引用别名为<name>的分组匹配到的字符串 | (?P<id>)adg(?P=id) | 1adg1 4adg4 |
5.特殊构造(不作为分组)
语法 | 说明 | 表达式 | 匹配结果 |
---|---|---|---|
?:… | ( ) 的不分组版本,用于使用‘|’ 或后接数量词 | (?:adg){2} | adgadg |
(?iLmsux) | iLmsux中每个字符代表一种匹配模式,智能用在正则表达式的开头 | (?i)adg | AdG |
(?#…) | #号后的内容作为注释被忽略 | adg(?#comment)123 | adg123 |
(?=…) | 之后的字符串内容需要匹配表达式才算成功,不消耗字符串内容 | a(?=\d) | 后面是数字的a |
(?!..) | 之后的字符串内容需要不匹配表达式才算成功,不消耗字符串内容 | a(?!\d) | 后面不是数字的a |
(?<=…) | 之前的字符串内容需要匹配表达式才算成功,不消耗字符串内容 | (?<=\d)a | 前面是数字的a |
(?<!..) | 之前的字符串内容需要不匹配表达式才算成功,不消耗字符串内容 | (?<!\d)a | 前面不是数字的a |
(?(id/name)) yes-pattern|no-pattern | 如果编号为id或别名为name的组匹配到字符串,则需要匹配yes-pattern,否则需要匹配no-pattern。|no-pattern可省略 | (\d)adg(?(1)\d | adg) |
二、RE模块
- 匹配一个反斜杠字符‘\’,你需要写成 ‘ \\ ’。解决方法是使用Python中的原始字符串,即在字符串最前面加上字母 r,这样字符串中的反斜杠都会被去掉特殊语义,看做普通字符。比如,字符串 r”\n” 是 包含‘\’和‘n’两个字符的字符串,而字符串 “\n” 是只有一个换行符的字符串。正则表达式通常使用 Python 中的原始字符串来表示。
1.匹配对象实例也有一些方法和属性,这里列出最重要的几个:
- match()方法是判断正则表达式是否从开始处匹配字符串,所以start()方法总是返回 0。然而,search()方法就不一样了,它扫描整个字符串,匹配的子字符串的开始位置不一定是 0。
- findall()方法需要在它返回结果之前创建出整个列表。但是finditer()方法将匹配对象作为迭代器返回(译者注:迭代器的方式更节省内存,效率更高)。
2.模块级别的函数:
不需要去创建一个匹配对象来调用它的方法,re 模块中也提供一些全局函数比如 match()、search()、findadd()、sub()等等。这些函数的第一个参数是正则表达式字符串,其他参数跟模式对象同名的方法采用一样的参数,返回值也一样,都是返回 None。由于内部缓冲机制,两者的效率不差上下。