2013-06-24 126 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") 
相关问题