正则表达式
元字符与转义
正则表达式的元字符包括: ^ $ . [ ] { } - ? * + ( ) | \
元字符有着特殊的意义,当需要取消元字符的特殊含义时,需要在元字符之前加上反斜线字符 \。
锚
^ 和 $ 在正则表达式中被当作锚,其中 ^ 匹配字符串的起始位置,$ 匹配字符串的结束位置。
任意字符
. 匹配除 \n 之外的任意字符。
否定
如果中括号内的第一个字符是 ^,表示匹配不在指定字符集内的字符。
字符范围
- 字符连接的两个字符表示范围,例如 [0-9] 等价于 [0123456789]。需要注意的是:- 左边字符的码值要小于右边字符的码值。
或选项
regex1 | regex2 表示匹配 regex1 或 regex2。
实例
a) 判断字符串 str 是否以数字开头
>>> re.search(r"^[\d][\s\S]*", str) != None;
b) 判断字符串 str 是否以小写字母结尾
>>> re.search(r"[\s\S]*[a-z]$", str) != None;
c) 匹配由空格隔开的字符串
>>> re.findall(r"[^ ]+", "long time no see"); ['long', 'time', 'no', 'see']
字符类简记法
\d 等价于 [0-9],其中的 d 表示数字(digital)
\D 等价于 [^\d]
\w 等价于 [0-9a-zA-Z],其中的 w 表示单词字符(word)
\W 等价于 [^\w]
\s 等价于 [ \t\r\n\v\f],其中的 s 表示空白字符(space)
\S 等价于 [^\s]
实例
a) 匹配字符串中的数字
>>> re.findall(r"[\d]+", "abc123def456"); ['123', '456']
b) 使用 [\s\S] 或 [\d\D]、[\w\W] 匹配任意字符,包括 \n
>>> re.search("^[\s\S]+$", "!@#$%^&*()12345qwert") != None True
POSIX 字符类
POSIX 字符类 | 描述 | ASCII 字符类 |
[:alnum:] | 字母字符与数字字符 | [0-9A-Za-z] |
[:blank:] | 空格符与制表符 | [ \t] |
[:cntrl:] | 控制字符 | [\x00-\x1F\x7F] |
[:digit:] | 数字字符 | [0-9] |
[:graph:] | 可见字符 | [\x21-\x7E] |
[:lower:] | 小写字母字符 | [a-z] |
[:print:] | 可打印字符,包括 [:graph:] 中所有字符再加上空格符 | [\x20-\x7E] |
[:punct:] | 标点符号字符 | |
[:space:] | 空白字符 | [ \t\r\n\v\f] |
[:upper:] | 大写字母字符 | [A-Z] |
[:word:] | 字母字符 | [0-9A-Za-z_] |
[:xdigit:] | 十六进制字符 | [0-9A-Fa-f] |
需要注意的是,有些语言不支持 POSIX 字符类,比如 Python、JavaScript 。Java 中,POSIX 字符类 [[:name:]] 必须使用 \p{Name} 的形式,比如 [:space:] 当写作 \p{Space},注意第一字母要大写,除了 [:xdigit:] 要写作 \p{XDigit}。
量词
量词 | 含义 |
{n} | 前面的元素恰好出现 n 次则匹配 |
{m,n} | 前面的元素出现的次数在 n~m 次之间时则匹配 |
{m,} | 前面的元素出现次数超过 n 次则匹配 |
{,n} | 前面的元素出现次数不超过 m 次则匹配 |
* | 等价于 {0,} |
+ | 等价于 {1,} |
? | 等价于 {0,1} |
贪婪匹配与惰性匹配
实例
a) 贪婪匹配
>>> re.findall(r"<span>[\s\S]*</span>", "<div><span>abc</span><br><span>xyz</span></div>"); ['<span>abc</span><br><span>xyz</span>']
a) 惰性匹配
>>> re.findall(r"<span>[\s\S]*?</span>", "<div><span>abc</span><br><span>xyz</span></div>");
['<span>abc</span>', '<span>xyz</span>']