正则表达式之字符组

正则表达式(一)

  正则表达式又称为正则法则,是一种字符串文本的处理方式,常用于字符串文本中定位或者查找一段信息,是通用的字符串方法。

  字符组

  普通字符组

  字符组是正则表达式最基本的结构之一。字符组表示“同一位置上可能出现的各种字符”,写法:[ ]方括号之间列出所有可能出现的字符。例如:[123]、[ab]、[#.?]等等。具体含义:[013456789]表示在同一个位置上可能出现0-9中任意一个数,重点强调是一位和一个数。此外,字符组中的字符出现顺序和出现次数对字符组没有影响,[0123456789]和[0215436879]是完全一致的。

  范围表示法:[0123456789]是不是忒长了?OK,用-表示范围,即:[0-9],如此一来是不是多快好省。但是要注意一点,不能9-0,因为9大于0啊。那如果是字母呢,可以[a-z]或者[A-Z],也不能z-a或者Z-A,因为在ASCII码表中每个字符都是有一个十进制码值的,如:0是45,A是65,a是97。而范围表示是码值小的-码值大的,按照书写规范上,应该是0-9,A-Z,a-z,切记不要错误认为A-z表示26个大写字母和26个小写字母,它们之间还有其他字母呢。大、小写字母表示方法为:[A-Za-z].

  元字符与转义

  字符组中的横线-用来表示范围,就不能用来匹配横线-字符了,这种在匹配中具有特殊意义的字符就是元字符。如果想要让元字符失去特殊意义来匹配普通字符,只能通过转义来完成,转义是指在正则表达式中的元字符前面加上反斜杠字符。例如:[0-9]表示匹配0、-、9中的一个字符。

  注意,[-09]也表示匹配-、0、9中的一个字符,而[0-9]表示匹配0到9中任意一个数字。足以表明元字符的使用也需要结合一定的使用位置,改变位置有可能使得元字符自动转义

  正则表达式的本质:正则表达式本身是按照定义的规则把字符组合成的字符串,正则表达式在代码中运行的前提是字符串,其次才是正则表达式,最后是按照正则匹配的结果。

  正则在程序中执行流程可以看出,从代码到得出匹配结果需要进行两次解析。第一次解析是从代码转化为正则表达式,第二次解析是把正则表达式解析成完整含义的正则规则,然后作用于字符串文本查找匹配,得出匹配结果。

  因此,在正则规则中[0-9]表示匹配0、-、9中的任意一个字符,那么[0-9]便为正则表达式,其含义“匹配0、-、9中的任意一个字符”便是解析而来的正则规则,有了正则规则再应用于文本查找匹配可以轻易找到匹配结果。那反推回去,代码中应该如何表示正则表达式呢?前面我们谈到,正则表达式实质是字符串,在python或者其他编程语言中都存在字符串转义的概念,如果需要的结果是[0-9],那我们代码中需要对“”转义,通常使用“\”得出“”。故,代码中我们需要写[0\-9]才可得出[0-9]的正则表达式。

  前面提到了代码中的转义问题,与之而来的是原生字符串的了,python代码中通常使用r“”表示“\”,也就是说在字符串的前面加上r可以表示原生字符串了,同样的原生字符串也就省略了代码解析成为正则表达式的过程,只需要在代码中写上r“正则表达式”即可。

  排除型字符组

   类似于普通字符组,在普通字符组 [ 方括号开始后加上脱字符^,写成[^0-9],表示当前位置上,匹配一个没有列出的字符,即匹配不是0-9的数字(非数字)。此外脱字符^可以用于正则表达式的开始处,表示起始位置;$可以用于正则表达式的结束处,表示结束位置。^[^0-9][0-9]$表示匹配以非数字开头,数字结尾的两位字符。

  字符组简记

  字符组[0-9]表示数字字符,[a-z]表示小写字母字符,[A-Z]表示大写字母字符,字符组可以表示其含义,但是符号使用又稍微有点复杂。字符组简记是使用语义化的语言来替代字符组进而达成和字符组相同的含义。

  普通字符组简记d表示数字(digital)字符,等效于[0-9];w表示单词(word)字符,等效于[-0-9a-zA-Z],单词字符是指数字、大小写字母、下划线;s表示空白(space)字符,等效于[  v f](第一个字符为空格),空白字符是一些特殊转义字符,如 制表符, 换行符, 回车符等等。

  字符组简记既可以单独使用,也可以结合字符组一起使用,如^[^d][a-z]w$,表示匹配3个字符的字符串,且字符串以非数字开头,中间是a到z中的任意一个字符,最后结尾处时一个单词字符,数字字母下划线中的任意一个。

  排除型字符组简记:D表示非数字字符,W表示非单词字符,S表示非空白字符。可以看出是对普通字符组简记的互补,也是对普通字符组简记的相对面,表示d能匹配,D一定不能匹配...,此外,利用其互补特性,可以实现全集效果,如[dD]、[wW]、[sS]均可表示匹配任意字符。

原文地址:https://www.cnblogs.com/snow-lanuage/p/10516029.html