1.3 排除型字符组
在方括号[………]中列出希望匹配的所有字符,这种字符组可以叫做"普通字符组"。它的确比较方便,不过,对于有些问题是普通字符组不能解决的。
问:第一个字符不是数字字符,第二个字符才是数字字符(比如A8、P8),应当如何比较方便的处理呢?数字字符的匹配简单,用上一节讲的[0-9]即可;不是数字就比较难办了,如果采用正向逻辑,就需要列出所有非数字的字符,这实在太多了,全部列出基本上不可能,此时就可以使用排除型字符组。排除型字符组(Negated Character Class) 非常类似普通字符组,只是在开方括号后紧跟一个 脱字符 ^ ,写作 [^……],表示在当前位置,匹配一个没有列出的字符。例如 [^0-9]表示的意思就是 0~9之外的字符,也就是 非数字字符。那么我们上面的问题也就迎刃而解了。 [^0-9][0-9] 便能匹配出 A8、P8等字符串了。
排除型字符组的描述是在当前位置,匹配一个没有列出的字符。也就是说排除型字符必须匹配一个字符,如果没有还是不得行哦。
re.search(r"^[^0-9][0-9]", "A8") != None # => True
re.search(r"^[^0-9][0-9]", "8") != None # => False
- 除了开方括号 [ 之后的 ^ ,排除型字符组的用法和普通字符组基本上一样,唯一需要改动的是,在排除型字符组中,如果需要表示横线 - ,那么 - 应该紧跟在 ^ 之后。
re.search(r"^[^-0-9]", "-") !=None # => True
1.4 字符组简记法
- 这个就是 [0-9] ,[A-Z] 这类字符组的简写法。
\d 等价于 [0-9] d代表数字 digit
\w 等价于 [0-9a-zA-Z] w代表数字 word
\s等价于 [\t\r\n\v\f] s代表空白字符 space
字符组简记法可以单独出现1,也可以使用在字符组中,比如 [0-9a-zA-Z] 也可以写作 [\da-zA-Z],[^0-9] 也可也写成 [^\d]。
\d、\w、\s 这三个普通字符组简记法正则表达式也提供了对应排除型字符组的简记法:\D、\W、\S,字母完全一致,只是改为大写。这些简记法是互补的:\s 能匹配的字符,\S 一定不能匹配,同理 \w、\d。[\s\S] [\w\W] [\d\D] 匹配任意字符, "." 号虽然能匹配任意字符,但点号不能匹配换行符。
1.5 字符组运算
-
.NET、Java、Object-C 提供了字符组运算的功能,可以在字符组内进行集合运算。例如要匹配所有元音字母(暂只考虑小写字母),可以使用 [aeiou]。如果要匹配所有辅音字母,可以使用 [b-df-hj-np-tv-z] ,但是这样写比较复杂,可以换个角度,从26个字母中减去元音字母(差集),剩下的就是辅音字母。
JAVA: [[a-z]&&[aeiou]],[a-z] 表示 a~z的所有小写字母, [^aeiou] 表示除元音字母外的所有字符,包括大写字母、数字、各种符号,两者作取交集,即可得到元音字母。
.NET:[a-z-[aeiou]]
POSIX字符组
某些文档中,可能会发现 类似 [:digit:]、[:lower:] 之类的字符组。上文介绍的字符组,都舜宇Perl衍生出来的正则表达式流派,这个流派叫做 PCRE 。除此之外,还有其他流派,比如 POSIX,它是一系列的规范,定义了UNIX操作系统应当支持的功能,其中自然也包含了正则表达式的规范, [:digit:] 之类的字符组就遵循 POSIX 内正则表达式的字符组。
如果只使用普通编程语言,可以不考虑POSIX字符组,如果想了解,可以在Linux中使用 Grep工具尝试下。这里笔者不在赘述了,非本文讲解重点。