如何统计另一个.txt文件中列表项的出现次数?
我有一份单词列表,我想知道这些单词在一个.txt文件中出现了多少次。我的单词列表大概是这样的:
wordlist = ['cup', 'bike', 'run']
我希望不仅能找到这些单词,还能找到像CUP、biker、running、Cups等其他形式的单词。所以我觉得我需要用到正则表达式。这里是我想到的,但它并没有奏效:
len(re.findall(wordlist, filename, re.I))
提前谢谢你们!
3 个回答
1
你首先需要猜测所有单词的不同形式,这听起来有点麻烦。不过,我写了一个简化的函数,灵感来自于我阅读的一个网站: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来标记单词的边界。
2
这个正则表达式还需要改进,但这应该能帮你入门:
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
2
你离答案很近了。不过,re.findall
需要的是一个模式和一个字符串,而不是一个单词列表和一个文件名。
但是,如果你把文件内容读成一个字符串,然后把单词列表变成一个模式,那就能解决问题了。
你需要的模式看起来像这样:r"cup|bike|run"
。你可以用 "|".join(wordlist)
来生成这个模式。
这种方法很宽松,会统计所有这些实例。需要注意的是,如果你的文件里有“我的警棍被破坏了”这样的句子,re.findall
会在更大的单词中找到“run”和“cup”。所以你可能需要调整你的模式,以便只匹配单词的开头和结尾。
如果你只想获取完整的单词,可以使用这个模式:r"\b(cup|bike|run)\b"
。当然,你需要把你想要的所有单词变体都填进去。