我有一个很长的文本文件(剧本(。我想将此文本文件转换为列表(每个单词都分开(,以便以后可以搜索它。
我目前拥有的代码是
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)