想问下(\d+)([a-z]+)+和((\d+)([a-z]+))+的区别
如代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | # 用正则表达式替换 更换位置 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积分~
来为老师/同学的回答评分吧