作者darkk6 (Mr. Pan)
看板Python
標題Re: [問題] 正規表示法"*?"
時間Sat May 28 22:40:24 2016
===============================================
如果用re.findall('o*?',source)會得到'','','','','','',''這個結果
我不太懂為什麼中間四個o有被匹配到卻不會顯示出來
===============================================
這個其實更有趣了,單看 o*? , 代表的是
零個以上的 o 盡量少取
根據 re.findall 的特性,他會由左而右不重疊的取出來
如果以 o*? 來去對 fooood 做 findall ,我們由左而右來看,
黃色的就是目前正在檢查的:
fooood , f 符合 "零個以上的 o" 嗎?
=> Yes, "零個 o" , 所以得到第一個
''
f
ooood , o 符合 "零個以上的 o" 嗎?
=> Yes, 符合
零個 o , 因為是 "盡量少取"
所以得到第二個
''
fo
oood , o 符合 "零個以上的 o" 嗎?
=> Yes, 符合
零個 o , 因為是 "盡量少取"
所以得到第三個
''
依此類推,所以你會得到很多的個 ''
補充,如果把 pattern 改成 o+? , 就會得到 'o','o','o','o'
因為 o+ 的 "最少" 是一個 ;
而 f 和 d 都不符合 "一個以上的 o" 所以不會被列入
若改成 o+ , 就會得到 'oooo' , 因為他很貪心把所有的 o 都吃掉了
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 223.139.154.78
※ 文章網址: https://www.ptt.cc/bbs/Python/M.1464446426.A.EBB.html
推 cryinrain: 原來如此!豁然開朗阿!!!!! 05/28 22:42
※ 編輯: darkk6 (223.139.154.78), 05/28/2016 22:49:03
推 cryinrain: 感謝大大指點迷津! 05/28 22:50
推 flashgodie: 長知識推 05/29 23:45
推 wevol: 長知識推 05/30 18:39
推 tuyutd0505: 長知識推!! 05/30 19:39
推 c74319: 利用顏色說明用心不得不推!! 05/31 11:02
推 gbllggi: 長知識推 05/31 21:55
推 kanggy: 謝謝大大用心說明 06/01 10:48
推 jason7086: 長知識 RE真的一堆規則沒用過還真看不懂 06/01 14:51
推 ms9831117: 用心推! 06/05 10:28
→ wadd: 用心。清楚的好文 06/07 09:42
→ yougigun: 不懂為什麼o符合零個o..也不懂怎有七個''.... 07/04 10:47