从文本文件创建每个单词的列表,不带空格、标点符号



我有一个很长的文本文件(剧本(。我想将此文本文件转换为列表(每个单词都分开(,以便以后可以搜索它。

我目前拥有的代码是

file = open('screenplay.txt', 'r')
words = list(file.read().split())
print words

我认为这可以将所有单词拆分为一个列表,但是我无法删除所有多余的东西,例如单词末尾的逗号和句点。我还想使大写字母小写(因为我希望能够以小写字母搜索并同时显示大写和小写单词(。任何帮助都会很棒:)

这是正则表达式的工作!

例如:

import re
file = open('screenplay.txt', 'r')
# .lower() returns a version with all upper case characters replaced with lower case characters.
text = file.read().lower()
file.close()
# replaces anything that is not a lowercase letter, a space, or an apostrophe with a space:
text = re.sub('[^a-z ']+', " ", text)
words = list(text.split())
print words

剧本应该足够短,以便一举读入记忆。如果是这样,则可以使用 translate 方法删除所有点点。最后,您可以通过使用 str.split 在空格上拆分来生成列表:

import string
with open('screenplay.txt', 'rb') as f:
    content = f.read()
    content = content.translate(None, string.punctuation).lower()
    words = content.split()
print words

请注意,这会将Mr.Smith更改为 mrsmith 。如果您希望它变得['mr', 'smith']那么您可以将所有标点替换为空格,然后使用 str.split

def using_translate(content):
    table = string.maketrans(
        string.punctuation,
        ' '*len(string.punctuation))
    content = content.translate(table).lower()
    words = content.split()
    return words

使用正则表达式模式(如 [a-z]+(可能会遇到的一个问题是它只匹配 ascii 字符。如果文件有重音字符,单词将被拆分。 Gruyère会变得['Gruy','re'].

您可以通过使用 re.split 拆分标点符号来解决此问题。例如

def using_re(content):
    words = re.split(r"[ %stn]+" % (string.punctuation,), content.lower())
    return words

但是,使用 str.translate 更快:

In [72]: %timeit using_re(content)
100000 loops, best of 3: 9.97 us per loop
In [73]: %timeit using_translate(content)
100000 loops, best of 3: 3.05 us per loop

使用 replace 方法。

mystring = mystring.replace(",", "")

如果您想要一个更优雅的解决方案,您将多次使用阅读正则表达式。大多数语言都使用它们,它们对于更复杂的替换等

非常有用

您可以使用字典指定不需要的字符,并根据您的选择设置当前字符串的格式。

replaceChars = {'.':'',',':'', ' ':''}
print reduce(lambda x, y: x.replace(y, replaceChars[y]), replaceChars, "ABC3.2,1,nCda1,2,3....".lower())

输出:

abc321
cda123

您可以使用简单的正则表达式来创建包含所有单词(一个或多个字母字符的序列(的集合

import re
words = set(re.findall("[a-z]+", f.read().lower()))

使用set每个单词将只包含一次。

只需使用findall即可按顺序为您提供所有单词。

你可以尝试这样的事情。不过可能需要在正则表达式上进行一些工作。

import re
text = file.read()
words = map(lambda x: re.sub("[,.!?]", "", x).lower(), text.split())

我已经尝试过这段代码,它适用于我的情况:

from string import punctuation, whitespace
s=''
with open("path of your file","r") as myfile:
    content=myfile.read().split()  
    for word in content:
        if((word in punctuation) or (word in whitespace)) :
            pass
        else:
            s+=word.lower()
print(s)
    

最新更新