如何将行添加到列表中作为单个字符串项?

时间:2014-12-18 19:33:15

标签: python python-2.7

我正在尝试在列表中添加文本行。我有以下代码:

theText = 'foo \n bar'
for line in theText:
    theList.append(line)
print theList

此代码打印:

['f', 'o', 'o', ' ', '\n', ' ', 'b', 'a', 'r']

当我期待更像的东西时:

['foo ', '\n bar']

有没有办法让整行成为列表中的单个字符串项?

5 个答案:

答案 0 :(得分:3)

如果你想要这些行并保持分隔符使用带有keepends=True的分割线,正确的结果是['foo \n', ' bar'],因为换行符在foo而不是bar的行上:

theText = 'foo \n bar'
print(theText.splitlines(True))
['foo \n', ' bar']

答案 1 :(得分:2)

您需要按换行符拆分字符串。否则,它会读取字符串中的每个字符。如果您将分隔符保留在捕获组中,re.split将保留分隔符:

import re
...
for line in re.split( '(\n)',theText ):
    theList.append(line)

但是,这会将换行符放在单独的项目中,如下所示:

['foo ','\n',' bar']

jaheba's answer建议使用re.findall,这会为您提供预期的输出:

for line in re.findall( '(\n?.+)',theText ):
    theList.append(line)

或者,如果要排除分隔符,可以完全忽略正则表达式,只需使用str.split

for line in theText.split('\n'):
    theList.append(line)

答案 2 :(得分:0)

您可以使用正则表达式:

re.findall('(\n?.+)', theText)

编辑:

只是为了澄清循环的行为。如果迭代一个字符串(即for char in string),则逐个字符地获取字符串。这与每个字符的索引(char_0 = string[0]char_1 = sring[1],...)一致。相反,文件对象的行为不同。对文件描述符的迭代产生文件的行。因此,如果您的文本是包含文本的文件,那么您将获得预期的结果。

答案 3 :(得分:0)

如果您需要输出,请尝试以下方法:

result = [word if i==0 else "\n" + word for 
              i,word in enumerate(theText.splitlines())]

enumerate将其参数的结果与数字配对,例如:

enumerate("abcd") == [(0, 'a'), (1, 'b'), (2, 'c'), (3, 'd')] # roughly

所以我们要说theText分隔换行符,如果它是句子中的第一个单词,请给我们单词本身,否则将"\n"添加到前面它

答案 4 :(得分:0)

你可以做什么,使用纯粹的python而没有库:

theText = theText.split('\n')
['\n'+theText[i] if i%2==1 else theText[i] for i in range(len(theText))]

产生所需的输出:

>>> theText = theText.split('\n')
>>> ['\n'+theText[i] if i%2==1 else theText[i] for i in range(len(theText))]
['foo ', '\n bar']
>>> 

一步一步:

>>> theText = 'foo \n bar'
>>> theText = theText.split('\n')
>>> theText
['foo ', ' bar']
>>> [theText[i] for i in range(len(theText)) if i%2==1]
[' bar']
>>> ['\n'+theText[i] for i in range(len(theText)) if i%2==1]
['\n bar']
>>> ['\n'+theText[i] if i%2==1 else theText[i] for i in range(len(theText))]
['foo ', '\n bar']
>>>