作者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://webptt.com/cn.aspx?n=bbs/Python/M.1464446426.A.EBB.html
1F:推 cryinrain: 原来如此!豁然开朗阿!!!!! 05/28 22:42
※ 编辑: darkk6 (223.139.154.78), 05/28/2016 22:49:03
2F:推 cryinrain: 感谢大大指点迷津! 05/28 22:50
3F:推 flashgodie: 长知识推 05/29 23:45
4F:推 wevol: 长知识推 05/30 18:39
5F:推 tuyutd0505: 长知识推!! 05/30 19:39
6F:推 c74319: 利用颜色说明用心不得不推!! 05/31 11:02
7F:推 gbllggi: 长知识推 05/31 21:55
8F:推 kanggy: 谢谢大大用心说明 06/01 10:48
9F:推 jason7086: 长知识 RE真的一堆规则没用过还真看不懂 06/01 14:51
10F:推 ms9831117: 用心推! 06/05 10:28
11F:→ wadd: 用心。清楚的好文 06/07 09:42
12F:→ yougigun: 不懂为什麽o符合零个o..也不懂怎有七个''.... 07/04 10:47