我正在尝试在列表中添加文本行。我有以下代码:
theText = 'foo \n bar'
for line in theText:
theList.append(line)
print theList
此代码打印:
['f', 'o', 'o', ' ', '\n', ' ', 'b', 'a', 'r']
当我期待更像的东西时:
['foo ', '\n bar']
有没有办法让整行成为列表中的单个字符串项?
答案 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']
>>>