Re: [問題] 正規表示法"*?"

作者: darkk6 (Mr. Pan)   2016-05-28 22:40:24
===============================================
如果用re.findall('o*?',source)會得到'','','','','','',''這個結果
我不太懂為什麼中間四個o有被匹配到卻不會顯示出來
===============================================
這個其實更有趣了,單看 o*? , 代表的是 零個以上的 o 盡量少取
根據 re.findall 的特性,他會由左而右不重疊的取出來
如果以 o*? 來去對 fooood 做 findall ,我們由左而右來看,
黃色的就是目前正在檢查的:
fooood , f 符合 "零個以上的 o" 嗎?
=> Yes, "零個 o" , 所以得到第一個 ''
fooood , o 符合 "零個以上的 o" 嗎?
=> Yes, 符合零個 o , 因為是 "盡量少取"
所以得到第二個 ''
fooood , o 符合 "零個以上的 o" 嗎?
=> Yes, 符合零個 o , 因為是 "盡量少取"
所以得到第三個 ''
依此類推,所以你會得到很多的個 ''
補充,如果把 pattern 改成 o+? , 就會得到 'o','o','o','o'
因為 o+ 的 "最少" 是一個 ;
而 f 和 d 都不符合 "一個以上的 o" 所以不會被列入
若改成 o+ , 就會得到 'oooo' , 因為他很貪心把所有的 o 都吃掉了
作者: cryinrain (啞貓)   2016-05-28 22:42:00
原來如此!豁然開朗阿!!!!!感謝大大指點迷津!
作者: flashgodie (花太香)   2016-05-29 23:45:00
長知識推
作者: wevol (小米)   2016-05-30 18:39:00
長知識推
作者: tuyutd0505 (Huang Jason)   2016-05-30 19:39:00
長知識推!!
作者: c74319 (阿嘉)   2016-05-31 11:02:00
利用顏色說明用心不得不推!!
作者: gbllggi (gbllggi)   2016-05-31 21:55:00
長知識推
作者: kanggy ((我還在,只是熱情不再))   2016-06-01 10:48:00
謝謝大大用心說明
作者: jason7086 (神經病)   2016-06-01 14:51:00
長知識 RE真的一堆規則沒用過還真看不懂
作者: ms9831117 (GK)   2016-06-05 10:28:00
用心推!
作者: wadd (醜男轉世-低調)   2016-06-07 09:42:00
用心。清楚的好文

Links booklink

Contact Us: admin [ a t ] ucptt.com