我想搜索一个文本并计算所选单词出现的次数。为了简单起见,我会说文本为“适合吗?”而我想数的单词是“ it”和“ fit”。
我编写了以下代码:
mystring = 'Does it fit?'
search_words = 'it', 'fit'
for sw in search_words:
frequency = {}
count = mystring.count(sw.strip())
output = (sw + ',{}'.format(count))
print(output)
输出为
it,2
fit,1
因为代码将“适合”中的“ it”计入“ it”的总数中。
我想要的输出是
it,1
fit,1
我尝试将第5行更改为count = mystring.count('\\b'+sw+'\\b'.strip())
,但每个单词的计数为零。我怎样才能使它正常工作?
答案 0 :(得分:1)
列表语法已关闭,但这是一种实现方法
bad_chars = [';', ':', '!', "*","?","."]
res = {}
for word in ["it","fit"]:
res[word] = 0
string = ''.join((filter(lambda i: i not in bad_chars, "does it fit?")))
for i in string.split(" "):
if word == i: res[word] += 1
print(res)
通过使用in
关键字,您正在检查该字符串是否在另一个字符串中,在这种情况下,it
在fit
内部,因此您发现2次出现的{{1} }
在这里它直接比较了删除标点符号/特殊字符之后的单词!
输出:
it
答案 1 :(得分:1)
您尝试在原始帖子中实现的正则表达式模式的问题在于/**
* @return the routing key or pattern for the binding.
* Multiple elements will result in multiple bindings.
*/
String[] key() default {};
,而不是模式本身。
@QueueBinding(value =
@Queue(value = "foo"), exchange = @Exchange("ex1"), key={"foo", "bar", "baz"})
(docs)返回方法被应用到的str.count()
中作为参数传递的str.count()
的不重叠出现次数-因此{ {1}}将返回str
-但是,str
仅用于使用字符串文字 进行子字符串标识,不适用于正则表达式模式。
以下使用您的原始模式和内置'lots of love'.('lo')
模块的解决方案应该很适合您。
2
如果您希望从str.count()
获得匹配项,而不考虑它们的大小写,例如re
,import re
mystring = 'Does it fit?'
search_words = 'it', 'fit'
results = dict()
for sw in search_words:
count = re.findall(rf'\b{sw}\b', mystring)
results[sw] = 0 if not count else len(count)
for k, v in results.items():
print(f'{k}, {v}')
,search_words
等每次出现在{{ 1}}包含在'Fit'
中存储的计数中-您可以通过更改以下行来实现:
'FIT'
到
'fIt'
答案 2 :(得分:-1)
尝试一下:
def count_words(string, *args):
words = string.split()
search_words = args
frequency_dict = {}
for i in range(len(words)):
if words[i][-1] == '?':
words[i] = words[i][:-1]
for word in search_words:
frequency_dict[word] = words.count(word)
for word, count in frequency_dict.items():
print(f'{word}, {count}')
可以,
count_words('Does it it it fit fit it?', 'it', 'fit')
输出为
it, 4
fit, 2