计算另一个字符串中多个字符串的出现次数

时间:2013-03-19 00:44:58

标签: python count

在Python 2.7中,给出了这个字符串:

  

斑点是一只棕色的狗。斑点有棕色头发。斑点的头发是棕色的。

在字符串中查找“Spot”,“brown”和“hair”总和的最佳方法是什么?在示例中,它将返回8.

我正在寻找像string.count("Spot","brown","hair")这样的东西,但是在元组或列表中使用“要找到的字符串”。

谢谢!

2 个答案:

答案 0 :(得分:8)

这就是你要求的,但请注意它也会计算“毛茸茸”,“眉毛”等字样。

>>> s = "Spot is a brown dog. Spot has brown hair. The hair of Spot is brown."
>>> sum(s.count(x) for x in ("Spot", "brown", "hair"))
8

您也可以将其写为map

>>> sum(map(s.count, ("Spot", "brown", "hair")))
8

更强大的解决方案可能会使用nltk package

>>> import nltk  # Natural Language Toolkit
>>> from collections import Counter
>>> sum(x in {"Spot", "brown", "hair"} for x in nltk.wordpunct_tokenize(s))
8

答案 1 :(得分:3)

我可以使用Counter

s = 'Spot is a brown dog. Spot has brown hair. The hair of Spot is brown.'
words_we_want = ("Spot","brown","hair")
from collections import Counter
data = Counter(s.split())
print (sum(data[word] for word in words_we_want))

请注意,由于'brown.''brown'是单独的计数器条目,因此计数不足1。

一个稍微不太优雅的解决方案,不会在标点符号上使用正则表达式:

>>> len(re.findall('Spot|brown|hair','Spot is a brown dog. Spot has brown hair. The hair of Spot is brown.'))
8

您可以通过

从元组创建正则表达式
'|'.join(re.escape(x) for x in words_we_want)

这些解决方案的优点在于,与gnibbler的解决方案相比,它们具有更好的算法复杂性。当然,实际上在真实世界数据上表现更好仍然需要通过OP来衡量(因为OP是唯一一个具有真实世界数据的人)