【问题标题】:Wrong result in str.count() method [duplicate]str.count() 方法中的错误结果[重复]
【发布时间】:2020-08-04 20:48:07
【问题描述】:

我对一个非常简单的字符串计数操作感到困惑:

s = 'BANANA'
s.count('ANA')

这应该是 2,对吧?由于子字符串,ANABANANA 中出现了 2 次。

但结果我得到了 1。

>>> s = 'BANANA'
>>> s.count('ANA')
1

不知道为什么会出现错误的结果。就是这么简单的操作!

感谢任何帮助。


PS:我该如何解决这个问题?

【问题讨论】:

  • Python Docs.count 只计算非重叠出现。
  • 所以,它只带来了第一个ANA,因为第二个A 重叠了?

标签: python string count


【解决方案1】:

string.count() 不计算重叠出现次数。

如果你想计算重叠的次数,一个简单的字符串循环将计算它:

s = 'BANANA'
i = 0
cnt = 0
while True:
    i = s.find('ANA', i)
    if i >= 0:
        i += 1
        cnt += 1
    else:
        break

或者,您也可以使用regex,如下@Henrique 的回答。

【讨论】:

  • 但只有new regex 库,正如我在下面回答的......
  • @HenriqueBranco 是的。我要补充一点。但是看到你已经添加了。点赞。
  • 这个前瞻正则表达式也适用(旧库和新库)-re.findall(r'(?=(ANA))', s) 并且 new regex 解决方案不应该返回 2 而不是 3 @HenriqueBranco?
  • 它有效并返回 2。如果您想编辑 @HenriqueBranco,可能会在答案中出现拼写错误。我无法编辑,因为它少于 6 个字符。
  • 我写错了,已经编辑过了。检查我的答案中的编辑!谢谢大家!
【解决方案2】:

在“BANANA”中,只有一个完整的“ANA”。 Count() 返回 1,因为它找到 'ANA' 后,剩下的就是 'NA'。

【讨论】:

    【解决方案3】:

    好问题。但是 Python 字符串 count() 不会“回溯”。一旦找到第一个“ANA”,它就会通过剩余的两个字母“NA”向前查找。

    这种“前向搜索”与大多数编程语言相同,例如 Java indexOf()、C strstr() 和 VB.Net InStr()

    【讨论】:

    • 我应该改用正则表达式吗?
    • 我认为正则表达式可能会有所帮助:您将 a) 定义搜索模式(例如“ANA”),然后 b) 计算返回的“组”的数量。但是您必须进行实验-我不确定。请发回你找到的东西:)
    【解决方案4】:

    使用新的regex 库解决了这个问题。它有一个新参数overlapped 非常有用。

    >>>import regex as re
    >>>len(re.findall("ANA", "BANANA", overlapped=True))
    2
    

    我在 SO 中的this question 找到了解决方案。

    【讨论】:

      猜你喜欢
      • 2018-11-01
      • 2020-11-13
      • 1970-01-01
      • 2015-05-27
      • 1970-01-01
      • 2012-10-06
      • 1970-01-01
      • 1970-01-01
      • 2016-03-19
      相关资源
      最近更新 更多