对于[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编码中的字符。