. ^ $ * + ? { } [ ] \ | ( )
[abc] 匹配 a b c
[a-c] 匹配a b c
[a-z] 匹配小写
$元字符在[]中,就不是元字符了,比如 [abm$] 就是匹配 a b m $
[^5] 匹配任何5以外的字符 除了5哦
转义 \ : \\ \[
特殊的转义字符:
\d [0-9] 数字
\D [^0-9] 非数字
\s [\t\n\r\f\v] 空白字符
\S [^\t\n\r\f\v] 非空白字符
\w [a-zA-Z0-9]
\W [^a-zA-Z0-9]
[\s,.] 匹配任何字符 或, 或.
* 匹配0或多个 ca*t ct caaaat
+ 匹配1或多个 ca+t cat caaaaat
? 匹配0或1个 ca?t ct cat
[m,n] 匹配至少m次,最多n次 [0,]等同于* [1,]等同于+ [0,1]等同于?
>>> import re
>>> p = re.compile('abc*',re.IGNORECASE)
>>> p
re.compile('abc*', re.IGNORECASE)
注意 :关于 ’|’ 要注意两点:
第一, 它在 ’[‘ ‘]’ 之中不再表示或,而表示他本身的字符。如果要在 ’[‘ ‘]’ 外面表示一个 ’|’ 字符,必须用反斜杠引导,即 ’/|’ ;
第二, 它的有效范围是它两边的整条规则,比如‘ dog|cat’ 匹配的是‘ dog’ 和 ’cat’ ,而不是 ’g’ 和 ’c’ 。如果想限定它的有效范围,必需使用一个无捕获组 ‘(?: )’ 包起来。比如要匹配 ‘ I have a dog’ 或 ’I have a cat’ ,需要写成 r’I have a (?:dog|cat)’ ,而不能写成 r’I have a dog|cat’
>>> s = ‘I have a dog , I have a cat’
>>> re.findall( r’I have a (?:dog|cat)’ , s )
['I have a dog', 'I have a cat']
‘/A’ 匹配字符串开头
匹配字符串的开头。它和 ’^’ 的区别是, ’/A’ 只匹配整个字符串的开头,即使在 ’M’ 模式下,它也不会匹配其它行的很首。
‘/Z’ 匹配字符串结尾
匹配字符串的结尾。它和 ’$’ 的区别是, ’/Z’ 只匹配整个字符串的结尾,即使在 ’M’ 模式下,它也不会匹配其它各行的行尾。
>>> s = '/* part 1 */ code /* part 2 */'
>>> re.findall(r'//*.*?/*/', s)
['/* part 1 */', '/* part 2 */']
‘(?<=…)’ 前向界定
括号中 ’…’ 代表你希望匹配的字符串的前面应该出现的字符串。
‘(?=…)’ 后向界定
括号中的 ’…’ 代表你希望匹配的字符串后面应该出现的字符串。
>>> s = '/* comment 1 */ code /* comment 2 */'
>>> re.findall( r'(?<=/\*).+?(?=\*/)',s)
[' comment 1 ', ' comment 2 ']