2017-09-15 158 views
2

我有一個多行字符串:如何在Python中將多行字符串拆分爲多行?

inputString = "Line 1\nLine 2\nLine 3" 

我想有一個陣列,每個元件將具有最大2行它它如下:

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

可以轉換inputString到outputStringList在蟒蛇。任何幫助將不勝感激。

+1

你嘗試過這麼遠嗎?請顯示你的代碼。 – Soviut

+1

另外,請解釋爲什麼你想要分割一些行,而不是其他分支。這沒有意義。 – Soviut

回答

3

您可以嘗試查找2行(向內看,以避免捕獲換行)或只有一行(來處理最後一行,奇數行)。我擴大你的例子來說明,它的作品超過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'] 

的「添加新行騙」 允許的過程,正確:

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

結果:

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

不錯,但不適用於's =「第1行\ nLine 2 \ nLine 3 \ nline4 \ nline5 \ nline6」' – Frane

+1

@Frane right!看我的編輯。簡單,處理所有情況,奇數,偶數,以換行符結束或不結束。 –

-2

我不確定您的意思是「最多2行」,以及您希望如何實現這一點。但是,換行符相當簡單。

'Line 1\nLine 2\nLine 3'.split('\n') 

這將導致:

['line 1', 'line 2', 'line 3'] 

要獲得怪異津貼「一些」行分裂,你必須寫自己的這個邏輯。

-1

使用str.splitlines()到全輸入分成行:

>>> 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'] 
2

以下是使用grouper itertools recipe將任意數量的行組合在一起的替代方法。

注意:您可以手動實施此配方,或者您可以選擇安裝實施此配方的第三方庫,即pip install more_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', '')] 

最後,對於每組行,只有非emptry字符串與換行符重新結合。

有關grouper的更多詳細信息,請參閱more_itertools docs

1

我希望我得到你的邏輯正確的 - 如果你想字符串列表,每個最多一個換行分隔符,然後將下面的代碼片段將工作:

# 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'] 

雖然這種解決方案不是最快也不是最好,它很容易理解,並且不涉及額外的庫。

1

我想從itertools文檔中發佈石斑魚配方,但PyToolz' partition_all實際上是更好一點。

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)] 
-1
b = "a\nb\nc\nd".split("\n", 3) 
c = ["\n".join(b[:-1]), b[-1]] 
print c 

['a\nb\nc', 'd'] 
相關問題