贪婪和⾮贪婪模式 | 手把手教你入门Python之九十一

上一篇:正则替换 | 手把手教你入门Python之九十
下一篇:正则表达式案例练习 | 手把手教你入门Python之九十二

本文来自于千锋教育在阿里云开发者社区学习中心上线课程《Python入门2020最新大课》,主讲人姜伟。

贪婪和⾮贪婪模式

Python⾥数量词默认是贪婪的(在少数语⾔⾥也可能是默认⾮贪婪),总是尝试匹配尽可能多的字符;
⾮贪婪则相反,总是尝试匹配尽可能少的字符。
*,?,+,{m,n} 后⾯加上 ? 使贪婪变成⾮贪婪。

>>> s="This is a number 234-235-22-423"
>>> r=re.match(".+(\d+-\d+-\d+-\d+)",s)
>>> r.group(1)
'4-235-22-423'
>>> r=re.match(".+?(\d+-\d+-\d+-\d+)",s)
>>> r.group(1)
'234-235-22-423'
>>>

正则表达式模式中使⽤到通配字,那它在从左到右的顺序求值时,会尽量“抓取”满⾜匹配最⻓字符串,在我们上⾯的例⼦⾥⾯,“.+”会从字符串的启始处抓取满⾜模式的最⻓字符,其中包括我们想得到的第⼀个整型字段的中的⼤部分,“d+”只需⼀位字符就可以匹配,所以它匹配了数字“4”,⽽“.+”则匹配了从字符串起始到这个第⼀位数字4之前的所有字符。

>>> re.match(r"aa(\d+)","aa2343ddd").group(1)
'2343'
>>> re.match(r"aa(\d+?)","aa2343ddd").group(1)
'2'
>>> re.match(r"aa(\d+)ddd","aa2343ddd").group(1)
'2343'
>>> re.match(r"aa(\d+?)ddd","aa2343ddd").group(1)
'2343'
>>>

示例:

import re

m = re.search(r'm.*a', 'o3rjomjadas')
print(m.group())  # mjada

# 尽可能少的匹配
n = re.search(r'm.*?a', 'o3rjomjadas')
print(n.group())  # mja

x1 = re.match(r"aa(\d+)", "aa2343ddd")
print(x1.group(0))  # aa2343
print(x1.group(1))  # 2343

x2 = re.match(r"aa(\d{2,}?)", "aa2343ddd")
print(x2.group(0))  # aa23
print(x2.group(1))  # 23

x3 = re.match(r"aa(\d+)ddd", "aa2343ddd")
print(x3.group(0))  # aa2343ddd
print(x3.group(1))  # 2343

x4 = re.match(r"aa(\d+?)ddd", "aa2343ddd")
print(x4.group(0))  # aa2343ddd
print(x4.group(1))  # 2343

x5 = re.match(r"aa(\d??)(.*)", "aa2343ddd")
print(x5.group(0))  # aa2343ddd
print(x5.group(1))  # 空
print(x5.group(2))  # 2343ddd

src = '<img data-original="https://rpic.douyucdn.cn/appCovers/2016/11/13/1213973_201611131917_small.jpg" src="https://rpic.douyucdn.cn/appCovers/2016/11/13/1213973_201611131917_small.jpg" style="display: inline;">'
x6 = re.search(r'https://.*?\.jpg', src)
print(x6.group())

配套视频

上一篇:windows 环境安装wamp软件实现php开发环境


下一篇:angularjs移除不必要的$watch