2013-06-24 161 views

回答

16

如果你想提高效率:

import re 
count = sum(1 for _ in re.finditer(r'\b%s\b' % re.escape(word), input_string)) 

這並不需要創建任何中間列表(不像split()),從而將有效地工作了大input_string值。

它也有標點符號正常工作的好處 - 它會正確地返回1作爲計數的短語"Mike saw a dog."(而一個argumentless split()不會)。它使用\b正則表達式標誌,該標誌匹配字邊界(在\w之間轉換,也可以是其他任何東西)。

如果您需要擔心ASCII字符集以外的語言,您可能需要調整正則表達式以適當地匹配那些語言中的非單詞字符,但對於許多應用程序而言,這會是過度複雜化,並且在許多其他情況下設置正則表達式的unicode和/或locale標誌就足夠了。

+0

像一個魅力工作!不知道爲什麼有一個downvote。你能解釋一下究竟發生了什麼或我在哪裏可以找到這個?我從來沒有看到一個帶下劃線的for循環。謝謝! – lost9123193

+0

@ lost9123193'_'經常用作循環中的佔位符:)。我相信Amber可以更好地解釋它:p – TerryA

+1

@ lost9123193 - '_'只是一個虛擬變量,這是一種說法,「我實際上並不關心這裏的價值」。在這種情況下,我正在使用它,因爲我們總是總結數字1;我們並不關心從're.finditer()'返回的匹配對象。 – Amber

3

使用列表理解:

>>> word = "dog" 
>>> str1 = "the dogs barked" 
>>> sum(i == word for word in str1.split()) 
0 

>>> word = 'dog' 
>>> str1 = 'the dog barked' 
>>> sum(i == word for word in str1.split()) 
1 

split()返回一個句子中所有的單詞的列表。然後,我們使用列表理解來計算單詞出現在句子中的次數。

+1

給誰就給誰downvoted這樣的:如果你要downvote,它通常是一個好主意,至少發表評論,解釋爲什麼。 – Amber

+0

@LennartRegebro並不意味着你應該低估答案。答案是正確的 – TerryA

+0

@LennartRegebro這不是一個有用的陳述。在StackOverflow上發佈答案的人經常希望學習和發佈問題的人一樣多;有用的和可操作的反饋是其中的重要部分。 – Amber

8

您可以使用str.split()了句轉換成一個單詞列表:

a = 'the dogs barked'.split() 

這將創建一個列表:

['the', 'dogs', 'barked'] 

可以再算上使用list.count()確切發生的數量:

a.count('dog') # 0 
a.count('dogs') # 1 

如果需要使用標點符號,喲你可以使用正則表達式。例如:

import re 
a = re.split(r'\W', 'the dogs barked.') 
a.count('dogs') # 1 
+0

這可能是最簡單的方法,但請注意,對於包含標點符號旁邊的字符串,它將失敗。 – Amber

+0

「\ W」正則表達式對任何外來詞語如咖啡廳都會失敗,這是一個缺點。 –

+0

@LennartRegebro會不會unicode標誌修復那個? – grc

2

您需要將句子拆分爲單詞。因爲你比如你可以做到這一點,只需

words = str1.split() 

但對於真正的單詞的用法你需要的東西更先進,也負責處理標點符號。對於大多數西方語言,在做str1.split()之前,您可以用空格替換所有標點符號。

在簡單的情況下,這也適用於英語,但請注意,「我」將被分成兩個詞:「我」和「米」,它實際上應該分成「我」和「上午」。但是這對於這個應用程序來說可能是過度的。

對於其他情況,例如亞洲語言或真實世界中的英語使用情況,您可能希望使用一個爲您分詞的庫。

然後你有一個單詞列表,你可以做

count = words.count(word) 
+0

哈哈,現在這個沒有理由被壓低了。我懷疑孩子氣。 ;-)但是我已經有超過20k了,所以我不介意,只好低頭。 –

+0

現在只要說,我沒有downvote。 – TerryA

+0

好的,我很高興聽到這個消息。 –

2
import re 

word = "dog" 
str = "the dogs barked" 
print len(re.findall(word, str)) 
0

下面是一個簡單的例子,我們可以將新單詞替換所期望的字,也爲出現的所需數量:

import string 

def censor(text, word):<br> 
    newString = text.replace(word,"+" * len(word),text.count(word)) 
    print newString 

print censor("hey hey hey","hey") 

輸出將是:+++ +++ +++

所述第一參數在函數中是search_string。 第二個是new_string,它將取代你的search_string。 第三次也是最後一次是發生次數。

+0

什麼是
? – RetroCode

0

讓我們考慮一下s = "suvotisuvojitsuvo"的例子。 如果你想計數不同的計數「suvo」和「suvojit」,那麼你使用count()方法...計數不同,即你不計算suvojit suvo ..只計算孤獨的「suvo」 。

suvocount = s.count("suvo") // #output: 3 
suvojitcount = s.count("suvojit") //# output : 1 

然後找到你必須從suvojit計數中否定的孤獨的suvo計數。

lonelysuvo = suvocount - suvojicount //# output: 3-1 -> 2 
0

這將是我與評論的幫助下解決方案:

word = str(input("type the french word chiens in english:")) 
str1 = "dogs" 
times = int(str1.count(word)) 
if times >= 1: 
    print ("dogs is correct") 
else: 
    print ("your wrong") 
相關問題