我有一个单词列表,我想查找它们在.txt文件中出现的次数。单词列表如下所示:
wordlist = ['cup', 'bike', 'run']
我希望不仅能够拿起这些单词,还能看到CUP,骑车,跑步,杯子等等。所以我想我需要一个正则表达式。这是我在想的但它不起作用:
len(re.findall(wordlist, filename, re.I))
提前致谢!
答案 0 :(得分:2)
你很亲密。但re.findall
采用模式和字符串,而不是单词列表和文件名。
但是,如果您将文件读入字符串并将单词列表转换为模式,那么您将获得它。
您需要的模式如下所示:r"cup|bike|run"
。你可以"|".join(wordlist)
来做到这一点。
这是计算所有这些实例的一种非常宽松的方式。请注意,如果您的文件中包含“我的警棍已被破坏”字样,那么re.findall
会在较大的字词内找到“run”和“cup”。因此,您可能需要调整模式以捕捉单词的开头和结尾。
要仅获取整个单词,请使用以下模式:r"\b(cup|bike|run)\b"
。当然,您需要填写您正在寻找的所有单词品种。
答案 1 :(得分: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 :(得分:1)
您将首先猜测所有形式的单词,这似乎是PITA。但这是我在阅读http://www.theenglishspace.com/spelling/后写的一个简化的fn:
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作为双方的单词边界。