对于[0-9]、[a-z]等常用字符组,正则表达式提供了更简单的记法,这就是字符组简记法(shorthands)。
常用的字符组简记法
| 含义 | 表达式 | 等价表达式 |
|---|---|---|
| 数字字符(0-9) | \d | [0-9] |
| 单词字符(数字字母下划线) | \w | [0-9a-zA-Z_] |
| 空白字符 | \s | [ \t\r\n\v\f](第一个字符是空格) |
“空白字符”并不难定义,它可以是空格字符、制表符\t、回车符\r,换行符\n等各种“空白”字符,只是不方便展现(因为打印出来都是空白)。
字符组简记法可以单独出现,也可以使用在字符组中,比如[0-9a-z]可以写作[\da-z],[^0-9]可以写作[^\d]。
相对于\d、\w、\s这三个普通字符组简记法,正则表达式也提供了对应排除型字符组的简记法:\D、\W、\S——字母完全一样,只是改为大写。这些简记法匹配的字符互补:\d能匹配的字符,\D一定不能匹配,\w能匹配的字符,\W一定不能匹配,\s能匹配的字符,\S一定不能匹配。
re.search(r'\d', '8') is not None # True
re.search(r'\d', 'a') is not None # False
妥善利用这种互补的属性,可以得到一些非常巧妙的效果。最简单的应用就是字符组[\s\S],它等价于[\w\W]、[\d\D],可以匹配“任意字符”。
关于字符组简记法,最后要补充两点:
- 如果字符组中如果出现了字符组简记法,最好不要出现单独的
-,比如[\d-a]就让人很困惑,在有些语言中-会被当作普通字符,而在有些语言中,这样写会报错。 - 以上说的
\d、\w、\s的匹配规则,都是针对ascii 编码而言的,也叫ASCII匹配规则。但是,目前一些语言中的正则表达式已经支持了Unicode字符,那么数字字符、单词字符、空白字符的范围,已经不仅仅限于ASCII编码中的字符。