eroshn 2019-11-09
# (1) 量词基本语法
# 1) . 匹配1个除换行外的任意字符
# 2) ? 匹配0个或者1个a
# 3) + 匹配1个或者多个a
# 4) * 匹配0个或者多个a
# 5) {m,n} 匹配m个至n个a,n可以取到
# {m,} 至少m次
# {m} 必须m次
# (2)贪婪模式与非贪婪模式 (若不加?,匹配的时候默认为贪婪模式)
贪婪模式 : 默认向更多次匹配
非贪婪模式: 默认向更少次匹配
贪婪模式在底层使用的是回溯算法:
回溯算法:默认从左向右进行匹配,一直到最后,直到最后再也匹配不到了,回头,找最后一个能够匹配到的数据
非贪婪模式: 在量词的后面加?,这个语法就是非贪婪,默认向更少次匹配
.?? .+? .*? .{1,25}?
strvar = "刘能和刘德华和刘铁锤子777子888"
#贪婪模式
print(lst = re.findall("刘.",strvar) ) #刘能 刘德 刘铁
print(lst = re.findall("刘.?",strvar) ) #刘能 刘德 刘铁
print(lst = re.findall("刘.*",strvar) ) #[‘刘能和刘德华和刘铁锤子777子888‘]
#非贪婪模式
print(lst = re.findall("刘.??",strvar)) #[‘刘‘, ‘刘‘, ‘刘‘]
print(lst = re.findall("刘.*?",strvar)) #[‘刘‘, ‘刘‘, ‘刘‘]
# (3) 边界符
转义字符 :\b backspace 退格
边界符也用的是\b,要注意转义
例如:word 卡住边界
(1) 卡住左边界 \bw #取以某字符为开头
(2) 卡住右边界 d\b #取以某字符为结尾
strvar = "pwd word szf"
lst = re.findall(r"\bw.*",strvar) #[‘word szf‘]
lst = re.findall(r"\bw.*?",strvar) #[‘w‘]
lst = re.findall(r"\bw.*? ",strvar) #[‘word ‘]
lst = re.findall(r"d\b",strvar)
lst = re.findall(r".*d\b",strvar)
lst = re.findall(r".*?d\b",strvar) # [‘pwd‘, ‘ word‘]
# (4) ^ $
^ 以...开头
$ 以...结尾
如果正则表达式里面出现了^ $ ,代表把这个字符串看成一个整体,再去匹配
即如果这个字符串不是以^后面那个字符串为开头,不是以$前面那隔字符串为结尾,匹配出来的就是空