想问下(\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去更换位置的话只能对最后一组更换位置,字符串其他位置不能更换。
请老师解释,谢谢!
23
收起
正在回答 回答被采纳积分+1
2回答
1.Python零基础入门
- 参与学习 人
- 提交作业 2727 份
- 解答问题 8160 个
想要进入Python Web、爬虫、人工智能等高薪领域,你需要掌握本阶段的Python基础知识,课程安排带你高效学习轻松入门,学完你也能听得懂Python工程师的行业梗。
了解课程
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星