• 生活就是这样,需要去灌溉!
    • 谢谢您的关注,欢迎您的注册与写作!
    • 循环往复,生生不息,或许这就是生命的意义吧!生命是插曲的产品吧!
    • 古今多少事,都付笑言中!
    • 风住尘香花已尽,日晚倦梳头。物是人非事事休,欲语泪先流。
    • 闻说双溪春尚好,也拟泛轻舟,只恐双溪舴艋舟,载不动许多愁。

Python3中正则表达式使用方法

Linux 柳叶扉鸿 7年前 (2018-05-21) 7648次浏览 已收录 扫描二维码
内容目录

贪婪匹配与非贪婪匹配

在使用上面的通用匹配.*的时候可能我们有时候匹配到的并不是想要的结果,我们看下面的例子:

Python3中正则表达式使用方法
在这里我们依然是想获取中间的数字,所以中间我们依然写的是(d+),数字两侧由于内容比较杂乱,所以两侧我们想省略来写,都写.*,最后组成^He.*(d+).*Demo$,看样子并没有什么问题,我们看下运行结果:
Python3中正则表达式使用方法
奇怪的事情发生了,我们只得到了 7 这个数字,这是怎么回事?

这里就涉及一个贪婪匹配与非贪婪匹配的原因了,贪婪匹配下,.*会匹配尽可能多的字符,我们的正则表达式中.*后面是 d+,也就是至少一个数字,并没有指定具体多少个数字,所以.*就尽可能匹配多的字符,所以它把 123456 也匹配了,给 d+留下一个可满足条件的数字 7,所以 d+得到的内容就只有数字 7 了。

但这样很明显会给我们的匹配带来很大的不便,有时候匹配结果会莫名其妙少了一部分内容。其实这里我们只需要使用非贪婪匹配匹配就好了,非贪婪匹配的写法是.*?,多了一个?,那么它可以达到怎样的效果?我们再用一个实例感受一下:

Python3中正则表达式使用方法
在这里我们只是将第一个.*改成了.*?,转变为非贪婪匹配匹配。结果如下:
Python3中正则表达式使用方法
很好,这下我们就可以成功获取 1234567 了。原因可想而知,贪婪匹配是尽可能匹配多的字符,非贪婪匹配就是尽可能匹配少的字符,.*?之后是 d+用来匹配数字,当.*?匹配到 Hello 后面的空白字符的时候,再往后的字符就是数字了,而 d+恰好可以匹配,那么这里.*?就不再进行匹配,交给 d+去匹配后面的数字。所以这样,.*?匹配了尽可能少的字符,d+的结果就是 1234567 了。

所以说,在做匹配的时候,字符串中间我们可以尽量使用非贪婪匹配来匹配,也就是用.*?来代替.*,以免出现匹配结果缺失的情况。

但这里注意,如果匹配的结果在字符串结尾,.*?就有可能匹配不到任何内容了,因为它会匹配尽可能少的字符,例如:

Python3中正则表达式使用方法
Python3中正则表达式使用方法
观察到.*?没有匹配到任何结果,而.*则尽量匹配多的内容,成功得到了匹配结果。

所以在这里好好体会一下贪婪匹配和非贪婪匹配的原理,对后面写正则表达式非常有帮助。


柳叶扉鸿 , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明Python3中正则表达式使用方法
相关文章
喜欢 (1)