我正在尝试将文本文件拆分为单词,\n
被视为一个单词。
我的输入是这个文本文件:
War and Peace
by Leo Tolstoy/Tolstoi
我想要一个这样的列表输出:
['War','and','Peace','\n','\n','by','Leo','Tolstoy/Tolstoi']
使用.split()
我明白了:
['War', 'and', 'Peace\n\nby', 'Leo', 'Tolstoy/Tolstoi']
所以我开始编写一个程序,将\ n作为单独的条目放在单词之后,代码如下:
for oldword in text:
counter = 0
newword = oldword
while "\n" in newword:
newword = newword.replace("\n","",1)
counter += 1
text[text.index(oldword)] = newword
while counter > 0:
text.insert(text.index(newword)+1, "\n")
counter -= 1
然而,该程序似乎挂在counter -= 1
一行,我不能为我的生活找出原因。
注意:我意识到这是工作,结果将是['Peaceby',“\ n”,“\ n”];这是一个不同的问题,以后要解决。
答案 0 :(得分:4)
您不需要这么复杂的方式,您只需使用正则表达式和re.findall()
来查找所有单词和新行:
>>> s="""War and Peace
...
... by Leo Tolstoy/Tolstoi"""
>>>
>>> re.findall(r'\S+|\n',s)
['War', 'and', 'Peace', '\n', '\n', 'by', 'Leo', 'Tolstoy/Tolstoi']
'\S+|\n'
将匹配所有无空白字符的组合,长度为1或更长(\S+
)或新行(\n
)。
如果要从文件中获取文本,可以执行以下操作:
with open('file_name') as f:
re.findall(r'\S+|\n',f.read())
详细了解正则表达式http://www.regular-expressions.info/
答案 1 :(得分:0)
为了摆脱两个\n
字符并成功分割空格以使列表的每个索引成为不同的单词,您可以先用单个空格替换\n\n
的值。 .. string.replace('\n\n', ' ')
并将其等同为新字符串,然后按空格分隔... newString.split(' ')
答案 2 :(得分:0)
当您正在阅读文件时,您可以逐行处理事物,这样您就可以在适当处理换行符时分割一行:
>>> [word for line in inputFile for word in line.rstrip('\n').split() + ['\n']]
['War', 'and', 'Peace', '\n', '\n', 'by', 'Leo', 'Tolstoy/Tolstoi', '\n']
简单分解:
for line in inputFile
:对于inputFile中的每一行for word in line.rstrip('\n').split() + ['\n']
:剥离换行符并拆分行,将新行重新添加为单独的元素如前所述,如果您使用split()
而没有分隔符,那么您实际上并不需要rstrip('\n')
。
您可以将这些精确的表达式用作循环而不是列表理解:
result = []
for line in inputFile:
for word in line.rstrip('\n').split():
result.append(word)
result.append('\n')
print(result)
给出了相同的输出:
['War', 'and', 'Peace', '\n', '\n', 'by', 'Leo', 'Tolstoy/Tolstoi', '\n']
答案 3 :(得分:0)
这是另一种变化:
with open('data.txt') as fobj:
for line in fobj:
words.extend(line.split())
words.append('\n')
它会拆分所有空格中的单词,包括标签。