元 字符:\.^$?+*{}[]()|
. 1. 匹配(除了换行符以外)任何'单个'的字符甚至是它本身, \.转义代表一定是它本身
[和] 2.1 匹配该集合的任意一个成员:经常用于不区分字符大小写 [Rr]eg[Ee]x 可以匹配regex/RegEx
2.2 [0-9]匹配0~9任何一个 ,[A-Z]匹配A~Z任意一个,[a-z],[A-Za-z0-9]
2.3 注意-只用在和字符之间,在字符集合之后,只能与-它本身相匹配,不是特殊字符 不需要转义
2.4 和中取非,[^0-9]匹配任何一个不是数字的字符 ,
注意:^的效果将作用于给定字符集合里的所有字符或区间,不仅是后面的一个
2.5 myarray[0]只能匹配到myarray0而不是myarray[0],因为[,],是元字符,需要转义myarray\[0\]
元字符在[]里面不需要转义,有和特殊的/的转义序列\/在括号里要用,$也需要转义
空白元字符 3.1 [\b]回退(并删除)一个字符
\f 换页 \n换行 \r回车 \t制表 \v垂直制表符
3.2 \r\n匹配一个'回车+换行'
类元字符 4.1 \d任何一个数字字符[0-9], \D任何一个非数字字符 [^0-9]
4.2 \w任何一个字母(大小均可),数字,下划线[a-zA-Z0-9_] \W与之相反
4.3 \s任何一个空白字符串 [\f\n\r\t\v] \S与之相反
4.4 POSIX字符类(先略过)
重复匹配 5.1 +(匹配前面的一个字符至少一次)
注意歧义:[0-9]+代表0-9重复多次 [0-9+]代表匹配0-9或者+(+号是元字符,但在括号里面不是)
5.2 *(匹配前面的一个字符0次或多次,可有可无)(*是元字符)
5.3 ?(匹配前面的一个字符0次或者1次)(?是元字符)https?是个好选择
5.4 {和}是元字符,记得像[和]一样的转义
{6}重复6次 {2,4}至少重复2次,至多重复4次
{3,}至少重复三次
5.5 懒惰匹配(尽可能少的匹配)与贪婪匹配防止过度匹配,见48页例子
*(贪婪) ---------- *?(懒惰)
+(贪婪)------------+?(懒惰)
{n, }(贪婪)------------{n, }?(懒惰)
位置匹配 6.1 单词边界 \b(用来匹配一个单词的开头或结尾)
, \b匹配的是这样一个位置:位于\w和\W之间(字母数字下划线和非字母数字下划线的一个位置)
\b匹配的是一个位置 不匹配任何字符
cap\b:以cap结尾的单词(p满足\w,空格满足\W,而\b在他们之间)
\bcap:以cap开头的单词 \bcap\b:单词cap
\B代表非单词边界(即字母数字下换线和字母数字下划线之间的位置、非字母数字下划线和非。。的位置)
\B-\B匹配 ( - )前面空格\W,后面-,\B在他们之间
\<只匹配单词的开头 ;\>只匹配单词的结尾
6.2 字符串边界 :字符串开头^,字符串结尾$
^\d表示必须以数字开头。\d$表示必须以数字结尾
注意^的多种用法,[^....]只有这种情况下代表求非
子表达式 7.1 用(和),将里面的视为一个独立元素,(和)是一个元字符 记得处理
7.2 |代表或 19|20匹配19或20
7.3 在python中()代表一个分组,只显示分组的内容(注意()里面第一个位置不能有?)
回溯引用 8.1 回溯引用指的是模式的后半部分引用在前半部分中定义的子表达式\1代表第一个子表达式,\2第二个。。
子表达式用()括起来
前后查找 9.1向前查找:必须匹配但不在结果中返回的模式 ?=(查找出现在被匹配文本之后的字符(但不消费))
比如.+(?=:) 子表达式匹配:但是只需要匹配就可以了不需要再结果显示
9.2 向后查找:查找出现在被匹配文本之前的字符(但不消费)?<=
比如(?<=\$)[0-9.]+ 匹配$不显示本来的$60.66显示60.66
9.3前后结合 :
9.4 对前后查找取非: !代替=
(?=)--------------------(?!)正负向前查找
(?<=)---------------------(?<!) 正负向后查找
嵌入条件 10.1 回溯引用条件
(\()?\d{3}(?(1)\)|-)\d{3}-\d{4}
(\()?匹配一个可有可无的(, (?(1)\)\-)代表如果前面的(匹配,则必须匹配)否则-
10.2 前后查找条件
\d{5}(?(?=-))-\d{4})
如果\d{5}出现了-在后面要匹配-\d{4}
?前面有内容代表匹配可有可无,(?。。。)后面有东西代表条件匹配,?前面有+,*,{}代表懒惰匹配
在python中的new
( … ) | 被括起来的表达式作为一个分组. findall 在有组的情况下只显示组的内容 | 'a123d' >>>'a(123)d' >>>结果为:'123' |
(?#...) | 注释,忽略括号内的内容 特殊构建不作为分组 | 'abc123' >>>'abc(?#fasd)123' >>>结果为:'abc123' |
(?= … ) | 表达式’…’之前的字符串,特殊构建不作为分组 | 在字符串’ pythonretest ’中 (?=test) 会匹配’ pythonre ’ |
(?!...) | 后面不跟表达式’…’的字符串,特殊构建不作为分组 | 如果’ pythonre ’后面不是字符串’ test ’,那么 (?!test) 会匹配’ pythonre ’ |
(?<= … ) | 跟在表达式’…’后面的字符串符合括号之后的正则表达式,特殊构建不作为分组 | 正则表达式’ (?<=abc)def ’会在’ abcdef ’中匹配’ def ’ |
(?:) | 取消优先打印分组的内容 | 'abc' >>>'(?:a)(b)' >>>结果为'[b]' |
?P<> | 指定Key | 'abc' >>>'(?P<n1>a)>>>结果为:groupdict{n1:a} |