2013-03-19 51 views
1

在Python 2.7,:计数出现在给定的这串另一个字符串

Spot是一条黄狗。斑点有棕色头发。斑点的头发是棕色的。

什么是找到字符串中“Spot”,“brown”和“hair”的总和的最佳方式?在这个例子中,它会返回8.

我正在寻找像string.count("Spot","brown","hair")之类的东西,但可以与元组或列表中的“要找到的字符串”一起使用。

谢谢!这将在数​​由1自'brown.''brown'是独立的计数器项

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)) 

注:

+0

你想在“大闸蟹”算“毛”? nltk答案不计算它,而'count()'和正则表达式应答。 – EOL 2013-03-19 01:11:18

+0

通过添加单词边界('\ b')很容易通过'regex'排除它。 – mgilson 2013-03-19 01:13:10

+0

的确,但这会改变你的答案。 :) – EOL 2013-03-19 01:21:41

回答

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 
+0

我正要添加到我的答案。如果我能我会+1再次为那一个 - 哦...... +1 – mgilson 2013-03-19 00:50:56

+0

我不会说关于NLTK什么,因为我不知道那个包。 – mgilson 2013-03-19 01:09:33

+0

+1为nltk选项,它不计算“多毛”中的“头发” - 如果这是原始海报想要的。 – EOL 2013-03-19 01:13:15

3

我可能会使用一个Counter

不标点符号绊倒了一个略显不足优雅的解决方案使用正则表达式:

>>> 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是唯一一个与现实世界的数据)

+1

而且我想,用正则表达式,你可以通过're.finditer' +老待机'总和(1 _中...)'成语懒洋洋地评估这一点。 – mgilson 2013-03-19 00:59:05

+0

用于'finditer()'和+1的正则表达式:对于较大的字符串和可能的字数,它们很快。 – EOL 2013-03-19 01:15:53

相关问题