正则表达式贪婪模式和非贪婪的理解

正则表达式贪婪模式和非贪婪的理解

这里我们的测试代码使用python,需要倒入re模块(import re)
用到的方法是 re的search方法

示例

import re

if __name__ == '__main__':
    line = "T Cats are 123 smarter than dogs"

    searchObj = re.search(r'C.*?(\d+).*', line, re.M | re.I)

    print(searchObj.groups())

    print(searchObj.group(0))
    print(searchObj.group(1))

这段代码的含义是用指定的正则 C.*?(\d+).*来匹配字符串 T Cats are 123 smarter than dogs 如果search方法匹配成功,那么searchObj.groups()返回匹配成功的元组。然后就是searchObj.group(i) 如果匹配成功的化searchObj.group(0)
表示匹配成功的字符串,就是模式C.*?(\d+).*匹配到的字符,如果模式中包含()这样的子模式那么searchObj.group(1-i)依次为各个子模式的匹配结果。像我们这个里只有一个()那么searchObj.group(i) 就只有一个1.

贪婪模式和非贪婪模式

示例

import re

if __name__ == '__main__':
    line = "T Cats are 123 smarter than dogs"

    searchObj = re.search(r'(C.*)(\d+).*', line, re.M | re.I)

    print(searchObj.groups())

    print(searchObj.group(0)) #整个匹配
    print(searchObj.group(1)) #(C.*)匹配的内容
    print(searchObj.group(2)) #(\d+) 匹配的内容

这里我们把C.*用括号括起来表示这个是一个子模式来直观的砍下贪婪和非贪婪
因为这里C.*后面没有问号说明是贪婪模式,那么这个子模式匹配到了什么那
结果是:Cats are 12
那么我们把这个子模式变成C.*?结果又是啥那
结果是:Cats are
这个贪婪和非贪婪同时会影响到后面的子模式\d+ 这个表示匹配一到n个数字
贪婪模式的时候这个\d+匹配到的是 3
非贪婪模式的时候 匹配到的是123

这里结果就很显然了,贪婪模式把\d+能够匹配到的三个数字吃了两个,确实贪婪,但是好在还是给留了一口汤,说明贪婪模式会尽可能多的匹配字符即使你是别的模式内的字符如果我也能匹配,那么我就会把他自己吃掉,只给留一个最少的字符来给后面的子模式匹配。非贪婪就显得高尚多了,你能匹配我也能匹配,那么我就让给你,经典孔融让梨被正则表达式学走了哈哈。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值