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

Python 如何计算另一个.txt文件中项目列表的出现次数?,python,Python,我有一个单词列表,我想知道它们在一个.txt文件中出现了多少次。单词列表如下所示: wordlist = ['cup', 'bike', 'run'] 我不仅想学会这些单词,还想学会CUP、biker、running、Cups等,所以我想我需要一个正则表达式。以下是我的想法,但它不起作用: len(re.findall(wordlist, filename, re.I)) 提前谢谢 你很接近了。但是re.findall采用的是模式和字符串,而不是单词列表和文件名 但是,如果您将文件读入字符串

我有一个单词列表,我想知道它们在一个.txt文件中出现了多少次。单词列表如下所示:

wordlist = ['cup', 'bike', 'run']
我不仅想学会这些单词,还想学会CUP、biker、running、Cups等,所以我想我需要一个正则表达式。以下是我的想法,但它不起作用:

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

提前谢谢

你很接近了。但是
re.findall
采用的是模式和字符串,而不是单词列表和文件名

但是,如果您将文件读入字符串并将单词列表转换为模式,那么您将得到它

您需要的模式如下所示:
r“cup | bike | run”
。你可以做
“|”。加入(单词列表)
来获得这个

这是计算所有这些实例的一种非常宽松的方法。请注意,如果您的文件中有“我的警棍已被打烂”字样,则
re.findall
将在较大的字样中找到“run”和“cup”。所以你可能想调整你的模式来捕捉单词的开头和结尾


要仅获取整个单词,请使用以下模式:
r“\b(杯赛|自行车|跑步)\b”
。当然,您需要填写您要查找的所有单词变体。

您很接近了。但是
re.findall
采用的是模式和字符串,而不是单词列表和文件名

但是,如果您将文件读入字符串并将单词列表转换为模式,那么您将得到它

您需要的模式如下所示:
r“cup | bike | run”
。你可以做
“|”。加入(单词列表)
来获得这个

这是计算所有这些实例的一种非常宽松的方法。请注意,如果您的文件中有“我的警棍已被打烂”字样,则
re.findall
将在较大的字样中找到“run”和“cup”。所以你可能想调整你的模式来捕捉单词的开头和结尾


要仅获取整个单词,请使用以下模式:
r“\b(杯赛|自行车|跑步)\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
from uuu future uuu与u语句一起导入#仅当<2.6
从集合导入defaultdict
进口稀土
matches=defaultdict(int)
打开(文件名)为f时:
对于有关findall(r'\b(杯赛自行车赛)的mtch,f.read(),关于I):
匹配[mtch.lower()]+=1

正则表达式需要工作,但这应该让您开始:

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
from uuu future uuu与u语句一起导入#仅当<2.6
从集合导入defaultdict
进口稀土
matches=defaultdict(int)
打开(文件名)为f时:
对于有关findall(r'\b(杯赛自行车赛)的mtch,f.read(),关于I):
匹配[mtch.lower()]+=1

你首先要猜出所有形式的单词,这似乎是一个挑战。但这里有一个简化的fn,我在阅读后写道:


它在猜测单词的变体方面过于慷慨,但这是可以的,因为这不是拼写检查,您将在两侧使用\b作为单词边界。

您必须首先猜测单词的所有形式,这似乎是一个错误。但这里有一个简化的fn,我在阅读后写道:


它在猜测单词的变体方面过于慷慨-但这没关系,因为这不是拼写检查,您将在两侧使用\b作为单词边界。

即使添加单词的开头和结尾调整,仍然会有不应该找到的单词(例如“hiccup”、“runt”等)。也许使用WordNet或其他一些字典之类的东西来查找一个单词的所有不同形式,然后在搜索词的两侧使用单词边界……谢谢,@tgray。我已经调整了我的答案,加入了一个匹配整个单词的模式。谢谢eksortso!我不明白模式/字符串的区别,现在我明白了。我实际使用的单词表是由较长的单词组成的,所以我不应该碰到cup and run出现的奇怪问题,但我肯定会更多地考虑只使用整个单词。谢谢@埃克索索,不客气!显然,WortNet在屈折形式的转换上是单向的;然而,WolframAlpha/Mathmatica在这方面做得相当好,即使添加单词tweak的开头和结尾,仍然会有不应该找到的单词(例如“hiccup”、“runt”等)。也许使用WordNet或其他一些字典之类的东西来查找一个单词的所有不同形式,然后在搜索词的两侧使用单词边界……谢谢,@tgray。我已经调整了我的答案,加入了一个匹配整个单词的模式。谢谢eksortso!我不明白模式/字符串的区别,现在我明白了。我实际使用的单词表是由较长的单词组成的,所以我不应该碰到cup and run出现的奇怪问题,但我肯定会更多地考虑只使用整个单词。谢谢@埃克索索,不客气!显然,WortNet在屈折形式的转换上是单向的;然而,WolframAlpha/Mathmatica在这方面做得相当好,不清楚你所做的是否有必要。你要解决的是当OP说“每个单词出现了多少次”时“每个单词出现了多少次”——在我看来,似乎不需要单独计算。此外,只检查单词的开头也是一个问题-它会在丘比特中“找到”杯子,在符文中运行,在无肉中运行肉,因此不清楚您是否需要这样做。你要解决的是当OP说“每个单词出现了多少次”时“每个单词出现了多少次”——在我看来,似乎不需要单独计算。此外,只检查单词开头也是个麻烦-它会在丘比特中“找到”杯子,在符文中运行,在无肉中运行,等等