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