正则表达式贪婪模式和非贪婪的理解
这里我们的测试代码使用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+
能够匹配到的三个数字吃了两个,确实贪婪,但是好在还是给留了一口汤,说明贪婪模式会尽可能多的匹配字符即使你是别的模式内的字符如果我也能匹配,那么我就会把他自己吃掉,只给留一个最少的字符来给后面的子模式匹配。非贪婪就显得高尚多了,你能匹配我也能匹配,那么我就让给你,经典孔融让梨被正则表达式学走了哈哈。