作者canamvskid (覚醒図监)
看板Python
标题Re: [问题] 正规表示法"*?"
时间Mon Jun 6 02:26:03 2016
: 这个其实更有趣了,单看 o*? , 代表的是 零个以上的 o 尽量少取
: 根据 re.findall 的特性,他会由左而右不重叠的取出来
: 如果以 o*? 来去对 fooood 做 findall ,我们由左而右来看,
: 黄色的就是目前正在检查的:
: fooood , f 符合 "零个以上的 o" 吗?
: => Yes, "零个 o" , 所以得到第一个 ''
: fooood , o 符合 "零个以上的 o" 吗?
: => Yes, 符合零个 o , 因为是 "尽量少取"
: 所以得到第二个 ''
: fooood , o 符合 "零个以上的 o" 吗?
: => Yes, 符合零个 o , 因为是 "尽量少取"
: 所以得到第三个 ''
: 依此类推,所以你会得到很多的个 ''
想请问一下,我用s1 = 'abc',然後 re.findall(r'o*?', s1)
得到的结果是 ['', '', '', '']
如果是从左到右一个个比对的话不是只有3个吗?
为什麽最後会多一个出来呢?
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 140.113.93.94
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Python/M.1465151166.A.3F9.html
1F:推 rlinlen: '' 属於'abc'的子集,findall的*(match 0)就把他抓进来了 06/06 11:33
2F:→ rlinlen: 试试看r'.*?'和r'.+?'会比较好懂 06/06 11:34
3F:推 LiloHuang: 每个字元之前都会 match,包含字串结尾 $ 前面的位置 06/08 21:05
4F:→ LiloHuang: Empty matches are included in the result unless the 06/08 21:05
5F:→ LiloHuang: result unless they touch the beginning of another 06/08 21:05
7F:→ LiloHuang: 有兴趣也可以玩一下 re.findall(r'o*?', s1, re.DEBUG) 06/08 21:07
8F:→ LiloHuang: 抓到的空白为标问号的位置 '?a?b?c?' 这样应该比较清楚 06/08 21:15
9F:→ LiloHuang: 就像 re.findall(r'o*?', '') 回传的不是 empty list 06/08 21:16
10F:→ LiloHuang: 更正 空字串 不是空白 XD 06/08 21:20