D21_2.1_正则表达式_多字符匹配

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) ^   $
^ 以...开头
$ 以...结尾
如果正则表达式里面出现了^ $ ,代表把这个字符串看成一个整体,再去匹配

即如果这个字符串不是以^后面那个字符串为开头,不是以$前面那隔字符串为结尾,匹配出来的就是空

相关推荐