Python 如何将行作为单个字符串项添加到列表中?
我正在尝试向列表中添加文本行。我有以下代码:Python 如何将行作为单个字符串项添加到列表中?,python,python-2.7,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'] 有什么方法可以使整行成为列表中的单个字符串项目吗?您需要按换行符拆分字符串。否则,它将读取字符串中的每个字符重新拆分将保
theText = 'foo \n bar'
for line in theText:
theList.append(line)
print theList
此代码打印:
['f', 'o', 'o', ' ', '\n', ' ', 'b', 'a', 'r']
当我期待更像:
['foo ', '\n bar']
有什么方法可以使整行成为列表中的单个字符串项目吗?您需要按换行符拆分字符串。否则,它将读取字符串中的每个字符<如果将分隔符保存在捕获组中,则代码>重新拆分将保留分隔符:
import re
...
for line in re.split( '(\n)',theText ):
theList.append(line)
但是,这会将换行符放在单独的项目中,如下所示:
['foo ','\n',' bar']
建议使用re.findall
,这将为您提供预期的输出:
for line in re.findall( '(\n?.+)',theText ):
theList.append(line)
或者,如果要排除分隔符,可以完全忽略正则表达式,只使用str.split
:
for line in theText.split('\n'):
theList.append(line)
您需要按换行符拆分字符串。否则,它将读取字符串中的每个字符<如果将分隔符保存在捕获组中,则代码>重新拆分将保留分隔符:
import re
...
for line in re.split( '(\n)',theText ):
theList.append(line)
但是,这会将换行符放在单独的项目中,如下所示:
['foo ','\n',' bar']
建议使用re.findall
,这将为您提供预期的输出:
for line in re.findall( '(\n?.+)',theText ):
theList.append(line)
或者,如果要排除分隔符,可以完全忽略正则表达式,只使用str.split
:
for line in theText.split('\n'):
theList.append(line)
您可以使用正则表达式:
re.findall('(\n?.+)', theText)
编辑:
只是为了澄清循环的行为。如果对字符串进行迭代(例如,字符串中的字符),则可以逐个字符地获取字符串。这与每个字符的索引一致(
char\u 0=string[0]
,char\u 1=sring[1]
,…)。相反,文件对象的行为不同。对文件描述符的迭代产生文件的行。因此,如果您的文本是一个包含文本的文件,您将获得预期的结果。您可以使用正则表达式:
re.findall('(\n?.+)', theText)
编辑:
只是为了澄清循环的行为。如果对字符串进行迭代(例如,字符串中的字符),则可以逐个字符地获取字符串。这与每个字符的索引一致(
char\u 0=string[0]
,char\u 1=sring[1]
,…)。相反,文件对象的行为不同。对文件描述符的迭代产生文件的行。因此,如果您的文本是一个包含预期结果的文本的文件。如果您需要该输出,请尝试以下操作:
result = [word if i==0 else "\n" + word for
i,word in enumerate(theText.splitlines())]
枚举
将其参数的结果与数字配对,例如:
enumerate("abcd") == [(0, 'a'), (1, 'b'), (2, 'c'), (3, 'd')] # roughly
因此,我们要在newline上拆分
文本,如果它是句子中的第一个单词,请给我们单词本身,否则请在前面添加“\n”
。如果需要输出,请尝试以下操作:
result = [word if i==0 else "\n" + word for
i,word in enumerate(theText.splitlines())]
枚举
将其参数的结果与数字配对,例如:
enumerate("abcd") == [(0, 'a'), (1, 'b'), (2, 'c'), (3, 'd')] # roughly
因此,我们要在newline上拆分文本,如果它是句子中的第一个单词,则给我们单词本身,否则在前面添加“\n”
。使用纯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']
>>>
使用纯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']
>>>
如果要保留这些行并使用分隔符,请使用带有keepends=True
,正确的结果是['foo\n','bar']
,因为换行符位于带有foo not bar的行上:
theText = 'foo \n bar'
print(theText.splitlines(True))
['foo \n', ' bar']
如果要保留这些行并使用分隔符,请使用带有keepends=True
,正确的结果是['foo\n','bar']
,因为换行符位于带有foo not bar的行上:
theText = 'foo \n bar'
print(theText.splitlines(True))
['foo \n', ' bar']
@AdamSmithpartition
仅拆分字符串一次。一个更大的字符串将返回['foo','\n','bar\n baz']
。我以为他想用它做更多的事情,而不仅仅是把它放在列表上,但你right@AdamSmithpartition
仅拆分字符串一次。一个更大的字符串将返回['foo','\n','bar\n baz']
。我以为他想用它做更多的事情,而不仅仅是把它放在列表上,但你right@DavidReeve嗯,的确如此。我忘了除了在re.S
模式下,
与换行符不匹配。我仍然认为以这种方式使用正则表达式太过分了。@davidree-hmmm确实如此。我忘记了
除了在re.S
模式下之外,与换行符不匹配。我仍然认为以这种方式使用正则表达式是非常过分的。只有当“foo\n bar\n baz”
的预期结果是[“foo”、“\n bar”、“baz”]
而不是[“foo”、“\n bar”、“\n baz”]
时,这才有效。在后一种情况下——我的答案是纯python,并生成该结果。坦白地说,我不知道OP为什么要保留空格和换行符!!!:)只有当“foo\n bar\n baz”
的预期结果是[“foo”、“\n bar”、“baz”]
而不是[“foo”、“\n bar”、“\n baz”]
时,这才有效。在后一种情况下——我的答案是纯python,并生成该结果。坦白地说,我不知道OP为什么要保留空格和换行符!!!:)谢谢你的回复。似乎我误解了代码中使用的line
是所提供字符串中某行的python关键字。我在网上的其他例子中看到了这种用法,并被误解了。显然,我可以在这里使用任意单词,它会引用字符串中的单个字符。有了这些知识,下面的split
建议解决了我的问题。感谢您提供的有用回复。似乎我误解了代码中使用的line
是所提供字符串中某行的python关键字。我在网上的其他例子中看到了这种用法,并被误解了。显然,我可以在这里使用任意单词,它会引用字符串中的单个字符。有了这些知识,下面的split
建议解决了我的问题。