0

我正在尝试编写一个程序来读取名为“GlassDog.txt”的文本文档中的所有单词。一旦程序读取了单词,它将需要删除所有标点符号,并将所有字母变为小写。然后当程序完成所有这些后,我希望它打印它找到的单词以及它在文档中使用了多少次。

到目前为止,这是我的代码:

def run():
    count = {} 
    for w in open('GlassDog.txt').read().split(): 
        if w in count: 
            count[w] += 1 
        else: 
            count[w] = 1

    for word, times in count.items(): 
        print ("%s was found %d times" % (word, times)) 

run()

此代码将读取并显示单词和单词的频率。但是,我找不到如何实现删除标点符号并用小写字母替换大写字母的代码的方法。这个问题可能已经被问过几次了,我似乎找不到任何专门做我正在寻找的东西。如果这是一个重复的问题,我很抱歉。

4

4 回答 4

1

您可以在字符串上使用 .lower() 以在 if 块之前转换为小写,并且仅匹配字母数字尝试使用正则表达式,具体查看 \w

于 2012-07-30T15:33:31.293 回答
1
from collections import Counter

def just_alnum(s):
    return ''.join(c for c in s if c.isalnum())

with open('GlassDog.txt', 'r') as f:
    counts = Counter(just_alnum(w.lower()) for w in f.read().split())
于 2012-07-30T15:36:42.313 回答
0
>>>msg = "Hello,World!"
>>>msg = msg.lower() #convert into all lowercase
>>>print msg
hello,world!
>>>msg = filter(lambda x: x.isalpha(), msg) #remove every character that isn't a letter
>>>print msg
helloworld
于 2012-07-30T15:35:08.113 回答
0

这种方法当然不是最优化的,但我认为它很健壮:

>>> msg = "A   very42 dirty__ string ©."
# Replace all non alphabetical characters (maybe you want isalnum() instead)
>>> msg = map(lambda x: x if x.isalpha() else ' ', msg)
# Concat splitted chars
>>> msg = ''.join(msg)
# Avoid multiple spaces
>>> msg = ' '.join(msg.split())
>>> msg
'A very dirty string'

在巨大且异构的输入上,它会消耗大量资源,因此,如果您想要更优化的东西,您应该根据您对输入文件了解的限制进行调整(例如:标点符号是否总是被空格包围? )。

此外,您可以在一行中完成所有这些工作,但是对于您的代码的下一个读者来说可能很难理解......

于 2012-07-30T16:07:19.873 回答