如何计算另一个.txt文件中项目列表的出现次数?
我有一个单词列表,我想查找它们出现在.txt文件中的次数。单词列表是一样的东西如下:如何计算另一个.txt文件中项目列表的出现次数?
wordlist = ['cup', 'bike', 'run']
我希望不仅能够拿起这些话,但还搞什么CUP,骑自行车,跑步,杯子等,所以我想我需要一个正表达。这是我在想什么,但它不起作用:
len(re.findall(wordlist, filename, re.I))
在此先感谢!
你很近。但re.findall
需要一个模式和一个字符串,而不是一个单词表和一个文件名。
但是,如果您将文件读入一个字符串并将您的文字列表转换为模式,那么您就会得到它。
您需要的图案如下所示:r"cup|bike|run"
。你可以做"|".join(wordlist)
得到这个。
这是计算所有这些实例的非常松散的方式。请注意,如果您的文件中包含“我的警棍已被盗用”字样,则re.findall
将在较大的单词内找到“运行”和“杯子”。所以你可能想调整你的模式来捕捉单词的开始和结尾。
要获取整个单词,请使用以下模式:r"\b(cup|bike|run)\b"
。当然,你需要填写你正在寻找的所有单词。
正则表达式的工作需要,但这应该让你开始:
from __future__ import with_statement # only if < 2.6
from collections import defaultdict
import re
matches = defaultdict(int)
with open(filename) as f:
for mtch in re.findall(r'\b(cup|bike|run)', f.read(), re.I):
matches[mtch.lower()] += 1
目前还不清楚是什么你在做什么是必要的。当OP说“发生了多少次”时,你解决的是“每次发生多少次*” - 在我看来,不需要单独计数。同时只检查\ b单词的开始是麻烦 - 它会在* cupid *中找到* cup *,*在* rune *中* run *,* *在肉中*等等 – 2010-06-27 19:49:40
您必须首先猜测各种形式的话,并且似乎PITA。但这里是一个简化的FN我读http://www.theenglishspace.com/spelling/后写道:
def getWordForms(word):
''' Given an English word, return list of possible forms
'''
l = [word]
if len(word)>1:
l.extend([word + 's', word + 'ing', word + 'ed'])
wor, d = word[:-1], word[-1:]
if d == 'e':
l.append(word + 'd')
l.append(wor + 'ing')
if wor[-1:] == 'f':
l.append(wor[:-1] + 'ves')
elif d == 'y':
l.append(wor + 'ied')
l.append(wor + 'ies')
elif d == 'z':
l.append(word + 'zes') # double Z
elif d == 'f':
l.append(wor + 'ves')
elif d in 'shox':
l.append(word + 'es')
if re.match('[^aeiou][aeiou][^aeiou]', word):
l.append(word + d + 'ing') # double consonant
l.append(word + d + 'ed')
return l
它是猜测的话的变种过于慷慨 - 但是,这是确定的,因为这不是一个拼写检查器,你将使用\ b。对于两边的词边界。
即使添加单词调整的开始和结束,仍然会有不应该被发现的单词(例如,“打嗝”,“矮胖”等)。也许使用WordNet或其他字典的东西来找到一个词的所有不同形式,然后在搜索词的两边使用词边界... – tgray 2010-06-25 18:48:51
谢谢,@tgray。我调整了我的答案,以包含匹配整个单词的模式。 – eksortso 2010-06-25 19:24:37
谢谢eksortso!我不明白模式/字符串的区别,现在我明白了。我实际使用的单词列表是由更长的单词组成的,所以我不应该遇到与杯子一起出现的奇怪问题并运行,但我一定会更多地考虑只用整个单词。谢谢! – dandyjuan 2010-06-25 20:12:31