正则表达式(多字符匹配)

本文深入解析了正则表达式的各种量词符号及其使用场景,包括贪婪与非贪婪模式的区别,以及边界符如何精确匹配目标字符串。通过实例演示了如何在Python中利用re模块进行模式匹配。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.量词符号(默认贪婪模式)

'''1) ? 匹配0个或者1个a '''
print(re.findall('a?b', 'abbzab abb aab'))  # ab  b ab ab b ab
'''2) + 匹配1个或者多个a '''
print(re.findall('a+b', 'b ab aaaaaab abb'))  # ab aaaaaab ab
'''3) * 匹配0个或者多个a '''
print(re.findall('a*b', 'b ab aaaaaab abbbbbbb'))  # b ab aaaaaab ab b b b b b b
'''4) {m,n} 匹配m个至n个a '''
# (1) 1 <= x <= 3
print(re.findall('a{1,3}b', 'aaab ab aab abbb aaz aabb'))  # aaab ab aab ab aab
# (2) 前面修饰的a , 必须是2个字符
print(re.findall('a{2}b', 'aaab ab aab abbb aaz aabb'))  # aab aab aab
# (3) 前面修饰的a , 至少是2个字符
print(re.findall('a{2,}b', 'aaab ab aab abbb aaz aabb'))  # aaab aab aab

2.贪婪模式 与 非贪婪模式
贪婪模式 : 默认向更多次匹配,底层用的是回溯算法
非贪婪模式: 默认向更少次匹配,用一个?号来进行修饰(修饰在量词的身后)
回溯算法: 从左向右进行匹配,一直到最后,直接最后再也匹配不到了,回头,寻找最后一个
'.'匹配任意字符,除了换行符\n

strvar = "刘能和刘老根和刘铁棍子777子888"
lst = re.findall("刘.", strvar)
print(lst)  # ['刘能', '刘老', '刘铁']
# 贪婪模式
lst = re.findall("刘.?", strvar)
print(lst)  # ['刘能', '刘老', '刘铁']
lst = re.findall("刘.+", strvar)
print(lst)  # ['刘能和刘老根和刘铁棍子777子888']
lst = re.findall("刘.*", strvar)
print(lst)  # ['刘能和刘老根和刘铁棍子777子888']
lst = re.findall("刘.{1,21}", strvar)
print(lst)  # ['刘能和刘老根和刘铁棍子777子888']
lst = re.findall("刘.*子", strvar)
print(lst)  # ['刘能和刘老根和刘铁棍子777子']
# 非贪婪模式
lst = re.findall("刘.??", strvar)
print(lst)  # ['刘', '刘', '刘']
lst = re.findall("刘.+?", strvar)
print(lst)  # ['刘能', '刘老', '刘铁']
lst = re.findall("刘.*?", strvar)
print(lst)  # ['刘', '刘', '刘']
lst = re.findall("刘.{1,21}?", strvar)
print(lst)  # ['刘能', '刘老', '刘铁']
lst = re.findall("刘.*?子", strvar)
print(lst)  # ['刘能和刘老根和刘铁棍子']

3.边界符 \b ^ $
\b backspace 本身就是一个转义字符
边界符 卡单词 word
卡住左边界 \bw
卡住右边界 d\b

strvar = "word pwd scf"
lst = re.findall(r".*d\b", strvar)
print(lst)  # ['word pwd']
lst = re.findall(r".*?d\b", strvar)
print(lst)  # ['word', ' pwd']
lst = re.findall(r"\bw.*", strvar)
print(lst)  # ['w']
lst = re.findall(r"\bw.*?", strvar)
print(lst)  # ['w']
# 正则表达式中写字符时,要谨慎,下面例子必须匹配到第一个空格时,才结束
lst = re.findall(r"\bw.*? ", strvar)
print(lst)  # ['word ']
lst = re.findall(r"\bw\S*", strvar)
print(lst)  # ['word']

4.边界符 \b ^ $
^ 必须以…开头
$ 必须以…结尾
如果出现了^ $ , 要把这个字符串看成一个整体

strvar = "大哥大嫂大爷"
print(re.findall('大.', strvar))  # ['大哥', '大嫂', '大爷']
print(re.findall('^大.', strvar))  # ['大哥']
print(re.findall('大.$', strvar))  # ['大爷']
print(re.findall('^大.$', strvar))  # []
print(re.findall('^大.*?$', strvar))  # ['大哥大嫂大爷']
print(re.findall('^大.*?大$', strvar))  # []
print(re.findall('^大.*?爷$', strvar))  # ['大哥大嫂大爷']
print(re.findall('^g.*? ', 'giveme 1gfive gay'))  # ['giveme ']
print(re.findall('five$', 'aassfive'))  # five
print(re.findall('^giveme$', 'giveme'))  # giveme
print(re.findall('^giveme$', 'giveme giveme'))  # []
print(re.findall('giveme', 'giveme giveme'))  # ['giveme', 'giveme']
print(re.findall("^g.*e", 'giveme 1gfive gay'))  # ['giveme 1gfive']
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值