0%

正则表达式入门二

零宽断言

零宽断言这四个字还是有些难以理解,所以还是直接上例子,直观又清晰。

零宽断言

但这一个名字我并没有理解这是什么东西,直到我看完了例子,下面直接给出例子:

(?=exp) 匹配后面为exp的内容,即 XXXexp,匹配XXX

例如 \b\w+(?=ing\b) 这个正则表达式,前面\b\w+的意思是首先匹配单词的开头,然后是连续的单词字符,到了后面括号里的,他就规定了前面这些东西必须满足后面是ing并且ing后是单词结束才能匹配,singing就会匹配出sing,如果是\b\w+(?=ing)会怎么样呢?实际上还是sing,为什么不是s?,马上就会在贪心和非贪心中给出答案

(?<=exp) 匹配前面为exp的内容,即 expXXX,匹配XXX

例如(?<=\bsi)\w+\b 这个正则表达式,会匹配以si开头的单词的除了si以外的部分,如singing,会匹配到inging。

负向零宽断言

仍然是直接看例子:

(?!exp) 匹配后面不是exp的内容,即 XXXexp,不匹配XXX

\d(?!\d) 匹配一位数字,而且他的后面不是数字,比如123,就只会匹配到3

(?<!exp) 匹配前面不是exp的内容,即 expXXX,不匹配XXX

(?<!\d)\d 匹配一位数字,而且他的前面不是数字,比如123,就只会匹配到1

贪心与非贪心

也可以叫做贪婪与懒惰,都是一个意思,比如 a\w+d这个正则表达式,现在我们知道他是匹配以a为开头d为结尾并且中间以不少于一个中英文数字字符的单词,但是如果是asdsd这样的字符串,那么他匹配的是asd还是asdsd呢?

答案是asdsd,因为一般默认的都是贪心匹配,他会尽可能的匹配较多的字符。

我们可以将这个正则表达式改为非贪心匹配,只需要在+后加一个?,就可以了

a\w+?d

这样匹配的结果就会匹配尽可能少的字符串,比如asdsd,就会匹配出asd,加的?号是用来限定他前面的代码的,+号是匹配一次或多次,用?号来限定他匹配更少的字符,所以要加在+号后。

注释

注释是很必要的,正则表达式是一种很复杂的语法,要给别人看或者看自己写了很久的正则表达式都需要费一番功夫,所以加上注释比较容易理解,注释的格式是:

(?#comment)

比如:

[1-9]\d(?#10-99) ,注释就提示了前面的正则表达式所表示的范围为10-99之间的数字。

结语

正则表达式的内容还有很多很多,这里只是最基础的用法,python中正则表达式库是re库,这个库是标准库,我们只需要import re就可以使用,有关re库的基础用法可以查看下一篇博客。