在方括号中列出希望匹配的所有字符,这种字符组叫做”普通字符组“,它的确很方便。不过,有些问题是普通字符组不能解决的。比如,给定一个由两个字符构成的字符串,要判断这两个字符中的第一个是数字字符,第二个不是数字字符(比如a8,z4)。数字字符的匹配很好处理,用[0-9]
即可,“不是数字”则很难办——不是数字的字符太多了,全部列出几乎不可能,这是就要使用排除型字符组。
排除型字符组(negated character class)非常类似普通字符组,只是在开方括号[
后紧跟一个脱字符^
,写作[^...]
,表示“在当前位置,匹配一个字符组中没有列出的字符”。所以[^0-9]
就表示“0-9之外的字符”,也就是“非数字字符”。
re.search(r'[^0-9]', '0') is not None # False
re.search(r'[^0-9]', 'a') is not None # True
排除型字符组必须匹配一个字符,这点一定要记住。
re.search(r'^[^0-9]8', 'a8') # True
re.search(r'^[^0-9]8', '8') # False
排除型字符组的用法与普通字符组几乎相同,唯一需要改动的是:在排除型字符组中,如果需要表示横线字符,那么-
应该紧跟在^
之后;而在普通字符组中,作为普通字符的横线-
应该紧跟在开方括号[
之后。
re.search(r'[^-0-9]', '-') is None # True
re.search(r'[^-0-9]', '7') is None # True
排除型字符组的转义
# 匹配一个0、1、2之外的字符
[^012]
# 匹配四个字符之一:0、^、1、2
[012^]
# ^紧跟在[之后,但经过转义变为普通字符,等价于上一个表达式,不推荐
[\^012]
网友评论