2013-03-19 84 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

相關問題