[问题] 关于正规表示法的r'\1'?

楼主: dosiris (希望大家开心)   2025-10-22 02:17:25
请教一下,在用下面的例子学正规表示法时:
import re
text="how are you I am fine!"
regex = r'(\w+)\s+(\w+)'
re.sub(regex, r'\1', text)
不是应该先把text用空格切分为how和are、you和I、am和fine!等三部分。
然后再根据r'\1'挑选出上述前部分的前面那个单字,即how、you、am合并为'how you am'
怎么执行的结果竟然把惊叹号也给am,变成输入为 'how you am!'
(把r'\r'改为r'\2'的输出就是符合预期的 'are I fine!' 说。)
不知道是哪里理解有错误吗?谢谢!
作者: penolove5566 (轻划)   2025-10-22 09:00:00
你这个观察非常敏锐 。问题的关键在于:re.sub() 并不是先把整个字串切分为多段、再各自取代;它是用滑动匹配 (greedy matching) 的方式,逐段依照正规表示式找到 所有匹配的“重叠区域”,并逐一取代。https://chatgpt.com/share/68f82dd5-a1d4-8009-bde0-f0aa2b654319
作者: CaptainH (Cannon)   2025-10-22 12:38:00
先match到"how are"→取代成"how"再match到"you I" → 取代为you最后match到"am fine"→取代为am剩下的"!"没有处理,保留你的症结应该是:\w只是[a-zA-Z0-9_], 不包括"!"

Links booklink

Contact Us: admin [ a t ] ucptt.com