想问下(\d+)([a-z]+)+和((\d+)([a-z]+))+的区别

想问下(\d+)([a-z]+)+和((\d+)([a-z]+))+的区别

如代码:

# 用正则表达式替换 更换位置
s = '1One22Two333Three4444Four55555Five666666six'
p2 = re.compile(r'(\d+)([a-z]+)+', re.I)  # 共2组:子组1(\d+); 子组2:([a-z]+)
p3 = re.compile(r'((\d+)([a-z]+))+', re.I)  # 共3组:子组1((\d+)([a-z]+)); 子组2:(\d+); 子组3:([a-z]+)
print('p2_group:', p2.search(s).group())  # 1One
print('p3_group:', p3.search(s).group())  # 1One22Two333Three4444Four55555Five666666six
print('p2_group(1):', p2.search(s).group(1))  # 1
print('p3_group(1):', p3.search(s).group(1))  # 666666six
print('p2_group(2):', p2.search(s).group(2))  # One
print('p3_group(2):', p3.search(s).group(2))  # 666666
print('p3_group(3):', p3.search(s).group(3))  # six

rest2_sub = p2.sub(r'\2->\1 ', s)
print('rest2_replace:', rest2_sub)
rest3_sub = p3.sub(r'\3->\2 ', s)
print('rest3_replace:', rest3_sub)

在用sub更换位置的时候,发现re1=(\d+)([a-z]+)+和re1=((\d+)([a-z]+))+的差别,本意是想写第二种re2的,结果写成了re1形式,能正常更换位置,后来检查代码的时候发现自己忘记写最外层的括号,加上之后(re2)反而不能正常替换,只能替换最后一组的位置。所以不太理解了,根据字符串s在写正则表达式的时候,\d+是一组,[a-z]+是子组,他们共同是一组,然后出现若干次,应该是re2才对。

但是实际情况是,re1通过search只能匹配到1One,并不能匹配到后面的;用group去取值的话,只能取到第一组的值(1One);用sub去调换位置的话,所有的都能按照要求调换。而re2通过search可以匹配到整个字符串,用group去取值的话,只能取到最后一组的值(666666six),用sub去更换位置的话只能对最后一组更换位置,字符串其他位置不能更换。

请老师解释,谢谢!

正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

2回答
好帮手慕笑蓉 2020-04-24 15:42:30

同学,你好。同学看一下下图的运行结果:

http://img1.sycdn.imooc.com//climg/5ea297e409311d0814580425.jpg

p3里的一二三组匹配到的数据只有此组数据('666666six', '666666', 'six'),所以group取值的时候,((\d+)([a-z]+))+怎么只能取到一部分。

如果解决了你的疑惑,请采纳,祝学习愉快~ 

  • 提问者 木苗 #1
    那为啥((\d+)([a-z]+))+用search就能匹配到整个字符串了
    2020-04-24 16:03:48
  • 好帮手慕笑蓉 回复 提问者 木苗 #2
    同学,你好。根据正则表达式((\d+)([a-z]+))+,search查找字符串的匹配结果,直到无法匹配时,将匹配到的结果一次性输出,因此得到整个字符串;findall不断的查找到所有能匹配到的结果,当将整个字符串查找完时,最后匹配到的结果就是'666666six', '666666', 'six',所以输出结果是('666666six', '666666', 'six')。正则匹配的机制,同学如果感兴趣,还可以到网络上查找相关资料进一步学习。 祝学习愉快。
    2020-04-26 10:33:54
好帮手慕笑蓉 2020-04-23 19:34:03

同学,你好。((\d+)([a-z]+))+在匹配到符合条件的数据后会继续向后匹配,若后边的满足正则,则继续匹配,若不满足,则输出当前匹配到的结果,而(\d+)([a-z]+)+是匹配到结果就会进行输出,因此得到同学所说的替换结果。

如果解决了你的疑惑,请采纳,祝学习愉快~ 

  • 提问者 木苗 #1
    我知道(\d+)([a-z]+)+匹配的是字符串的一部分,而((\d+)([a-z]+))+匹配到的是完整的字符串,就是不明白group取值的时候,((\d+)([a-z]+))+怎么只能取到一部分呢,不是应该取到全部吗
    2020-04-24 14:03:53
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
1.Python零基础入门
  • 参与学习           人
  • 提交作业       2727    份
  • 解答问题       8160    个

想要进入Python Web、爬虫、人工智能等高薪领域,你需要掌握本阶段的Python基础知识,课程安排带你高效学习轻松入门,学完你也能听得懂Python工程师的行业梗。

了解课程
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师