取等于号后面数字正则表达式_Python学习第139课--正则表达式之greedy match和nongreedy match...

【每天几分钟,从零入门python编程的世界!】

43464e07dc2dedaade6852402a77155c.png

上节我们学习了在正则表达式中,用{}进行精确重复次数的字符串的匹配模式,即exactly match,这节我们介绍greedy match和nongreedy match,即贪婪匹配模式和非贪婪匹配模式的匹配。

●exactly match--精确重复次数的匹配模式

模式:re{number}

re代表正则表达式中的一个字符串,number是一个具体的阿拉伯数字,关于精确重复次数的匹配,上节已进行介绍,这里简略带过。


因为精确重复次数的匹配用到了{},贪婪模式和非贪婪模式的匹配也要用到{},所以在这里顺带提了一下。

●greedy match--贪婪的匹配模式

模式:re{number1,number2}

re代表正则表达式中的一个字符串,number1和number2都是数字,number2大于number1。

这种模式的写法,意思是寻找number1到number2个re匹配的字符串,最少找到number1个,最多找到number2个。

所谓贪婪模式,就是指按照上限去寻找匹配,尽量找最多的字符串,能找到多少就要找到多少。

比如a{1,3}就是最少找到1个,最多找到3个a。如果字符串中有3个a,就会找到3个a,如果有2个a,就会找到2个a,如果有1个a,会找到1个a,如果一个a都没有,就会因找不到而报错。


我们用具体代码进行验证说明:

c2f2d9c272018c0397da2dd04c508839.png

运行结果:

4e261d3f34aae88711fb75fc3fc0f645.png


说明:

我们看到上面代码中,字符串message中的电话号码是86-19999999999,正则表达式的模式字符串是r"(d){1,3}-(d){8,13}",意思是从message这个字符串中找到"以1到3个数字开头,接着跟一个横杠-,后面再跟8到13个数字"的字符串。

因为这个message中,86-19999999999这个字符串横杠前面有2个数字86,符合{1,3}表示的1到3个数字的要求,因为是贪婪模式,要尽量取最多的数字,有多少就找多少,所以找到了86,横杠后面是11个数字,所以找到了19999999999这11个数字,而不是找到19999999这8个数字。


同理,如果message中的电话号码这样写:860-1999999999999,这里横杠后面是13个数字,那么最终找到的字符串就是"860-1999999999999"。


代码如下:

4a510175add1e8bfb417005317bca0ec.png

运行结果:

1784d372d29c237027f26326bb57130d.png


如果message中的电话号码这样写呢:86000-1999999999999999999

最终找到的字符串就是"000-1999999999999"

为什么呢?因为我们的正则表达式r"(d){1,3}-(d){8,13}"

是以横杠连接的,所以寻找的时候是以横杠为起始点,往前或者往后去数重复多少次。

●nongreedy match--非贪婪的匹配模式

模式:re{number1,number2}?

非贪婪和贪婪的匹配模式的区别就是,非贪婪模式是在{}后面跟一个问号?。

所谓非贪婪模式,就是它不贪婪,只要找到下限规定的个数就行了。

直接上代码,一目了然:

ab7ebb0c6811383ef33da98bd03a22bf.png


运行结果:

060ac9f12a38065ce8207d75d423b5bb.png


说明:

上面代码中,正则表达式的模式字符串r"(d){1,3}-(d){4,13}?",表示"找到横杠前面是1到3个数字,横杠后面是4到13个数字的字符串"。

我们看到message中电话号码是860-1999999999999999999,

因为正则表达式中横杠前的{}后面没有问号,是贪婪模式,所以最终找到的结果横杠前是860,而正则表达式中横杠后的{}后面有问号,是非贪婪模式,所以从横杠后面只找了4个数字1999。


大家可以自己敲代码验证。

我是时问新,欢迎关注我。跟我一起从零开始学习Python,每天花一点时间,开启python编程新世界的大门,领略新的风光,让人生多一种可能!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值