[問題] 關於正規表示法的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_], 不包括"!"
作者: dosiris (希望大家開心)   2025-10-25 17:39:00
了解 學到寶貴一課 謝謝分享!

Links booklink

Contact Us: admin [ a t ] ucptt.com