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

0 投票
3 回答
1277 浏览
提问于 2025-04-16 00:26

我有一份单词列表,我想知道这些单词在一个.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"。当然,你需要把你想要的所有单词变体都填进去。

撰写回答