str.count()统计结果异常?banana字符串中ana计数问题求助
为什么"banana"中统计"ana"只返回1?
嘿,这个问题的核心是默认的字符串匹配都是非重叠的,你误以为会统计重叠出现的子串啦!
先拆解下"banana"的字符位置(索引从0开始):
b(0) a(1) n(2) a(3) n(4) a(5)
你觉得的两次"ana"其实是:
- 第一次:a(1) n(2) a(3)
- 第二次:a(3) n(4) a(5)
但不管是str.count()还是默认的re.findall(),它们的匹配逻辑都是找到一个匹配后,跳过整个匹配的字符,从下一个位置继续查找:
- 用
str.count("ana")时,找到第一个匹配(位置1-3)后,会直接跳到位置4开始查找,剩下的字符是n(4)a(5),不够3个字符,所以只返回1。 - 普通的
re.findall("ana", str)也是一样的逻辑,匹配完第一个"ana"后,指针移到位置4,找不到新的匹配,结果长度还是1。
如果想要统计重叠的子串,你需要用正则的正向预查(lookahead),因为预查不会"消耗"字符,只会检查当前位置后面是否符合条件。写法如下:
import re str = "banana" print(len(re.findall(r'(?=ana)', str))) # 输出2
这里的(?=ana)是正向肯定预查,它会遍历字符串的每个位置,检查该位置后面是否跟着"ana",每找到一个符合条件的位置就记一次,这样就能统计到重叠的两次啦!
内容的提问来源于stack exchange,提问作者Barbara Liskov
相关产品推荐
相关产品推荐

