Python学习笔记之正则表达式的贪婪和非贪婪模式的实践

本文通过实例详细讲解了Python正则表达式中的贪婪模式和非贪婪模式的区别。通过对比`.+`和`.+?`在不同情况下的匹配结果,阐述了贪婪模式如何尽可能多地匹配字符,而非贪婪模式则尽可能少地匹配。同时,通过多个实践案例分析了两种模式下正则表达式如何处理相同字符的匹配问题,揭示了正则表达式在字符串匹配中的逻辑和行为。
摘要由CSDN通过智能技术生成

疯狂学习python中,最近又遇到不明白的地方啦----正则表达式的贪婪模式和非贪婪模式,又做了一些实践操作,如下:

.+?三个符号经常一起出现
首先来解释一下分别是什么意思:
“?”-----匹配0个或1个由前面的正则表达式定义的片段,非贪婪方式
"+
"----匹配0个或多个的表达式
“.”----匹配任意字符,除了换行符

下面来看实践

# #------------------练习非贪婪/贪婪模式模式-----------
import re
str1 = 'telphone number is:123-456-789'
pattern1 = r'(.?)(\d+-\d+-\d+)'
pattern2 = r'(.+)(\d+-\d+-\d+)'
pattern3 = r'(.+?)(\d+-\d+-\d+)'
pattern4 = r'(.?+)(\d+-\d+-\d+)'#如果交换?与.就会直接报错
obj1 = re.match(pattern1,str1)
obj2 = re.match(pattern2,str1)
obj3 = re.match(pattern3,str1)
# obj4 = re.match(pattern4,str1)
print("-------?非贪婪--------\\n")
print(obj1)
 # print(obj1.group())
# print(obj1.group(1))
# print(obj1.group(2))
print("-------*贪婪模式--------\\n")
print(obj2)
print(obj2.group(1))
print(obj2.group(2))
print("-------非贪婪模式-------\\n")
print(obj3)
print(obj3.group(1))
print(obj3.group(2))
# # print("-------测试*和?交换顺序会不会影响--这种不会输出none而是会直接报错\\n")
# print(obj4)
# # print(obj4.group(1))
# # print(obj4.group(2))

上述代码的运行结果是
在这里插入图片描述
对上面的代码进行简单的说明
1.为什么注释掉obj1的group()方法?
在这里插入图片描述
回答:可以看到并没有匹到字符,那么group是不能匹配到字符的,如果不注释掉就会报错
2.为什么定义了pattern4,却没有用呢,反而将其注释掉了呢?
在这里插入图片描述
回答:定义pattern3和pattern4的初衷是为了对比“+”“?”位置调换对匹配字符会不会有什么影响,可以看见pattern3是可以正常匹配的,但是pattern4不能正常工作,还会报错,打印对象不会出none,而是直接报下面这一堆错
在这里插入图片描述
整个就这样报错,我想我一定是踩雷了吧,我连搜为什么都不知道怎么搜,但是可以想见不可以像pattern4那样将“?”放在“+”前面

3.关于pattern2和pattern3是最重要的,简直是整篇笔记的点睛之笔
回答:这就是贪婪模式(pattern2)和非贪婪模式(pattern3)之间很明显的区别
注意看:pattern2的group(1)是telphone number is:12,所谓的贪婪模式就是按照正则一直匹配符合的字符直到遇到满足下一个条件的字符

(1)如果说两个用贪婪模式的正则,一前一后,遇见了两者都符合的字符,那么谁能匹配到这个字符呢?
这个就要依据当时有多少这样的字符啦,如果说有三个,那么占大头的一定是处于前面的字符
以这里说明,obj3中,数字123既符合前面的".“也符合后面的”\d",可以看见最后前面的字符直接争抢到了两个

(2)如果说,前面的正则是非贪婪,后面是贪婪,遇见了两者都符合的字符,那么谁能匹配到这个字符呢?
前面一定一个也抢不着,看采用用pattern3匹配的obj3,中123都被后面的"\d+"抢走了
(3)如果说,前面的正则是贪婪,后面是非贪婪,遇见了两者都符合的字符,那么谁能匹配到这个字符呢?
这里再做一个实践:
实践一:

import re
str1 = 'telphone number is:123-456-789'

pattern = r'(.+)(\d-\d+-\d+)'
pattern1 = r'(.+)(\d)'
pattern2 = r'(.+)(\d?)'
pattern3 = r'(.+)(\d-\d-\d)'
obj= re.match(pattern,str1)
print(obj)
print(obj.group(1))
print(obj.group(2))

输出的结果是:
在这里插入图片描述
这里说明一个问题,远水还是能救近火的,就是+在后面,还能能帮到前面的\d抢数字
实践二:

import re
str1 = 'telphone number is:123-456-789'

# pattern = r'(.+)(\d-\d+-\d+)'
# pattern1 = r'(.+)(\d)'
# pattern2 = r'(.+)(\d?)'
pattern3 = r'(.+)(\d-\d-\d)'
obj3= re.match(pattern3,str1)
print(obj3)

运行结果:
在这里插入图片描述
这是为什么呢,是因为没有了上面的+,后面的全部都被抢了到了第一个\d这里只剩下一个数字9,后面的正则都没有办法满足,然而整体又要都满足才能匹配成功,下面的实践三可以明确说明:
实践三:

import re
str1 = 'telphone number is:123-456-789'

# pattern = r'(.+)(\d-\d+-\d+)'
pattern1 = r'(.+)(\d)'
# pattern2 = r'(.+)(\d?)'

obj1= re.match(pattern1,str1)
print(obj1)
print(obj1.group(1))
print(obj1.group(2))

运行结果:
在这里插入图片描述
这个就不解释了,跟实践二结合起来就能理解
实践四:

import re
str1 = 'telphone number is:123-456-789'

# pattern = r'(.+)(\d-\d+-\d+)'
# pattern1 = r'(.+)(\d)'
pattern2 = r'(.+)(\d?)'
obj2= re.match(pattern2,str1)
print(obj2)
print(obj2.group(1))
print(obj2.group(2))

运行结果:
在这里插入图片描述
这个简直是对\d最狠的一种方式,如果你不要也行,那么我就全要了
就是这么贪!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值