2010-06-25 42 views
0

我有一個單詞列表,我想查找它們出現在.txt文件中的次數。單詞列表是一樣的東西如下:如何計算另一個.txt文件中項目列表的出現次數?

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

我希望不僅能夠拿起這些話,但還搞什麼CUP,騎自行車,跑步,杯子等,所以我想我需要一個正表達。這是我在想什麼,但它不起作用:

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

在此先感謝!

回答

2

你很近。但re.findall需要一個模式和一個字符串,而不是一個單詞表和一個文件名。

但是,如果您將文件讀入一個字符串並將您的文字列表轉換爲模式,那麼您就會得到它。

您需要的圖案如下所示:r"cup|bike|run"。你可以做"|".join(wordlist)得到這個。

這是計算所有這些實例的非常鬆散的方式。請注意,如果您的文件中包含「我的警棍已被盜用」字樣,則re.findall將在較大的單詞內找到「運行」和「杯子」。所以你可能想調整你的模式來捕捉單詞的開始和結尾。

要獲取整個單詞,請使用以下模式:r"\b(cup|bike|run)\b"。當然,你需要填寫你正在尋找的所有單詞。

+1

即使添加單詞調整的開始和結束,仍然會有不應該被發現的單詞(例如,「打嗝」,「矮胖」等)。也許使用WordNet或其他字典的東西來找到一個詞的所有不同形式,然後在搜索詞的兩邊使用詞邊界... – tgray 2010-06-25 18:48:51

+0

謝謝,@tgray。我調整了我的答案,以包含匹配整個單詞的模式。 – eksortso 2010-06-25 19:24:37

+1

謝謝eksortso!我不明白模式/字符串的區別,現在我明白了。我實際使用的單詞列表是由更長的單詞組成的,所以我不應該遇到與杯子一起出現的奇怪問題並運行,但我一定會更多地考慮只用整個單詞。謝謝! – dandyjuan 2010-06-25 20:12:31

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 
+0

目前還不清楚是什麼你在做什麼是必要的。當OP說「發生了多少次」時,你解決的是「每次發生多少次*」 - 在我看來,不需要單獨計數。同時只檢查\ b單詞的開始是麻煩 - 它會在* cupid *中找到* cup *,*在* rune *中* run *,* *在肉中*等等 – 2010-06-27 19:49:40

1

您必須首先猜測各種形式的話,並且似乎PITA。但這裏是一個簡化的FN我讀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。對於兩邊的詞邊界。

相關問題