在python中如何将多行字符串拆分为多行?

在python中如何将多行字符串拆分为多行?,python,Python,我有一个多行字符串: inputString = "Line 1\nLine 2\nLine 3" 我想要一个数组,每个元素最多有2行,如下所示: outputStringList = ["Line 1\nLine2", "Line3"] 我可以在python中将inputString转换为outputStringList吗。任何帮助都将不胜感激。我不确定您所说的“最多两行”是什么意思,以及您希望如何实现这一目标。然而,在换行符上进行拆分是相当简单的 'Line 1\nLine 2\nLin

我有一个多行字符串:

inputString = "Line 1\nLine 2\nLine 3"
我想要一个数组,每个元素最多有2行,如下所示:

outputStringList = ["Line 1\nLine2", "Line3"]

我可以在python中将inputString转换为outputStringList吗。任何帮助都将不胜感激。

我不确定您所说的“最多两行”是什么意思,以及您希望如何实现这一目标。然而,在换行符上进行拆分是相当简单的

'Line 1\nLine 2\nLine 3'.split('\n')
这将导致:

['line 1', 'line 2', 'line 3']
要获得“某些”行拆分的奇怪容差,您必须为此编写自己的逻辑。

用于将完整输入拆分为行:

>>> inputString = "Line 1\nLine 2\nLine 3"
>>> outputStringList = inputString.splitlines()
>>> print(outputStringList)
['Line 1', 'Line 2', 'Line 3']
然后,连接第一行以获得所需结果:

>>> result = ['\n'.join(outputStringList[:-1])] + outputStringList[-1:]
>>> print(result)
['Line 1\nLine 2', 'Line 3']
奖励:为任意数量的所需行编写一个相同的函数:

def split_to_max_lines(inputStr, n):
    lines = inputStr.splitlines()
    # This define which element  in the list become the 2nd in the
    # final result. For n = 2, index = -1, for n = 4, index = -3, etc.
    split_index = -(n - 1)
    result = ['\n'.join(lines[:split_index])]
    result += lines[split_index:]
    return result

print(split_to_max_lines("Line 1\nLine 2\nLine 3\nline 4\nLine 5\nLine 6", 2))
print(split_to_max_lines("Line 1\nLine 2\nLine 3\nline 4\nLine 5\nLine 6", 4))
print(split_to_max_lines("Line 1\nLine 2\nLine 3\nline 4\nLine 5\nLine 6", 5))
返回:

['Line 1\nLine 2\nLine 3\nline 4\nLine 5', 'Line 6']
['Line 1\nLine 2\nLine 3', 'line 4', 'Line 5', 'Line 6']
['Line 1\nLine 2', 'Line 3', 'line 4', 'Line 5', 'Line 6']

您可以尝试查找两行(其中包含lookahead以避免捕获换行符)或仅查找一行(处理最后一行奇数)。我扩展了您的示例,以显示它适用于3行以上的情况(有一点“欺骗”:在末尾添加一个换行符以处理所有情况:

import re

s = "Line 1\nLine 2\nLine 3\nline4\nline5"
result = re.findall(r'(.+?\n.+?(?=\n)|.+)', s+"\n")

print(result)
结果:

['Line 1\nLine 2', 'Line 3\nline4', 'line5']
['Line 1\nLine 2', 'Line 3\nline4', 'line5\nline6']
“添加换行符作弊”允许正确处理:

    s = "Line 1\nLine 2\nLine 3\nline4\nline5\nline6"
结果:

['Line 1\nLine 2', 'Line 3\nline4', 'line5']
['Line 1\nLine 2', 'Line 3\nline4', 'line5\nline6']

这里有一种替代方法,可以使用将任意数量的行组合在一起

注意:您可以手动实现此配方,也可以选择安装为您实现此配方的第三方库,即
pip install more\u itertools

代码

from more_itertools import grouper


def group_lines(iterable, n=2):
    return ["\n".join((line for line in lines if line))
                    for lines in grouper(n, iterable.split("\n"), fillvalue="")]
演示

s1 = "Line 1\nLine 2\nLine 3"
s2 = "Line 1\nLine 2\nLine 3\nLine4\nLine5"


group_lines(s1)
# ['Line 1\nLine 2', 'Line 3']

group_lines(s2)
# ['Line 1\nLine 2', 'Line 3\nLine4', 'Line5']

group_lines(s2, n=3)
# ['Line 1\nLine 2\nLine 3', 'Line4\nLine5']

详细信息

group_lines()
将字符串拆分为行,然后通过
grouper
n
对行进行分组

list(grouper(2, s1.split("\n"), fillvalue=""))
[('Line 1', 'Line 2'), ('Line 3', '')]
最后,对于每组行,只有非空字符串与换行符重新连接


有关
grouper

的更多详细信息,请参阅。我希望我能正确理解您的逻辑-如果您想要一个字符串列表,每个字符串最多有一个换行符,那么以下代码段将起作用:

list(grouper(2, s1.split("\n"), fillvalue=""))
[('Line 1', 'Line 2'), ('Line 3', '')]
# Newline-delimited string
a = "Line 1\nLine 2\nLine 3\nLine 4\nLine 5\nLine 6\nLine 7"
# Resulting list
b = []

# First split the string into "1-line-long" pieces
a = a.split("\n")

for i in range(1, len(a), 2):

    # Then join the pieces by 2's and append to the resulting list
    b.append(a[i - 1] + "\n" + a[i]) 

    # Account for the possibility of an odd-sized list
    if i == len(a) - 2: 
        b.append(a[i + 1])

print(b)

>>> ['Line 1\nLine 2', 'Line 3\nLine 4', 'Line 5\nLine 6', 'Line 7']

虽然这个解决方案既不是最快的,也不是最好的,但它很容易理解,而且不需要额外的库。

我也想从itertools文档中发布石斑鱼食谱,但实际上它有点更好

from toolz import partition_all

s = "Line 1\nLine 2\nLine 3\nLine 4\nLine 5"
result = ['\n'.join(tup) for tup in partition_all(2, s.splitlines())]
# ['Line 1\nLine 2', 'Line 3\nLine 4', 'Line 5']

为了完整起见,下面是grouper的
解决方案:

from itertools import zip_longest

# Recipe from the itertools docs.
def grouper(iterable, n, fillvalue=None):
    "Collect data into fixed-length chunks or blocks"
    # grouper('ABCDEFG', 3, 'x') --> ABC DEF Gxx"
    args = [iter(iterable)] * n
    return zip_longest(*args, fillvalue=fillvalue)

result = ['\n'.join((a, b)) if b else a for a, b in grouper(s, 2)]
给予

['a\nb\nc', 'd']

到目前为止,您尝试了什么?请展示您的代码。另外,请解释为什么您希望拆分一些行,而不是其他行。这没有任何意义。很好,但不适用于
s=“Line 1\nLine 2\nLine 3\nLine 4\nLine 5\nLine 6”
@Frane right!请参阅我的编辑。简单,可以处理所有情况,奇数、偶数,以换行或不换行结束。