如何计算另一个.txt文件中项目列表的出现次数?

时间:2010-06-25 18:17:13

标签: python

我有一个单词列表,我想查找它们在.txt文件中出现的次数。单词列表如下所示:

wordlist = ['cup', 'bike', 'run']

我希望不仅能够拿起这些单词,还能看到CUP,骑车,跑步,杯子等等。所以我想我需要一个正则表达式。这是我在想的但它不起作用:

len(re.findall(wordlist, filename, re.I))

提前致谢!

3 个答案:

答案 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作为双方的单词边界。