You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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(),它们的匹配逻辑都是找到一个匹配后,跳过整个匹配的字符,从下一个位置继续查找:

  1. 用str.count("ana")时,找到第一个匹配(位置1-3)后,会直接跳到位置4开始查找,剩下的字符是n(4)a(5),不够3个字符,所以只返回1。
  2. 普通的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:30:41