零宽断言
零宽断言这四个字还是有些难以理解,所以还是直接上例子,直观又清晰。
零宽断言
但这一个名字我并没有理解这是什么东西,直到我看完了例子,下面直接给出例子:
(?=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库的基础用法可以查看下一篇博客。