2016-08-15 32 views
1

我有我的代碼在這裏:Python的替代oneliner不使用正則表達式

a = u"\n".join(my_array).replace(u"\n\n", u"\n") 

的問題是,如果有"\n\n\n\n"你留下了"\n\n",我只是想一個"\n"

所以我已經拿出:

a = u"\n".join(my_array) 
while a.find(u"\n\n")>=0: 
    a = a.replace(u"\n\n", u"\n") 

我想知道是否有更優雅的方式/也許oneliner 沒有使用正則表達式在Python中做到這一點?

+0

@DeepakKamat:給我的感覺是,OP想避免這樣做在多重循環輸入字符串... –

+1

爲什麼不使用正則表達式?另外,通常「單行問題」的答案是:編寫一個函數。 –

+0

另外,爲什麼在加入'\ n'後刪除重複的'\ n'? 「加入之前剝奪'\ n'是否更容易?在'my_array'的字符串裏面可以有'\ n \ n'嗎?您應該顯示一些輸入數據和預期輸出。 –

回答

3

如果你真的想這樣做,在一個行,而無需使用正則表達式,單程多\n的所有序列降低單\n將是第一split\n再由join所有非空段由單個\n組成。

>>> a = "foo\n\nbar\n\n\nblub\n\n\n\nbaz" 
>>> "\n".join(x for x in a.split("\n") if x) 
'foo\nbar\nblub\nbaz' 

這裏,a整個字符串,即你沒有"\n".join(my_array)後,並根據什麼my_array本來就是,有可能是更好的解決方案,例如在加入之前從各條線上剝離\n,但這仍然有效。

+0

我喜歡它我會嘗試並驗證它是否正常 –

0

也許這可以幫助:

u"\n".join(s.replace(u'\n', '') for s in my_array)) 
+0

也許,除非'my_array'中的某些字符串包含嵌入換行符,即不在字符串末尾的換行符。 –

2

要將換行符的序列轉換爲單個換行符,您可以在換行符上拆分字符串,然後在重新加入之前過濾掉空字符串。例如,

mystring = u"this\n\nis a\ntest string\n\nwith embedded\n\n\nnewlines\n" 
a = u'\n'.join(filter(None, mystring.split(u'\n'))) 
print '{0!r}\n{1!r}'.format(mystring, a) 

輸出

u'this\n\nis a\ntest string\n\nwith embedded\n\n\nnewlines\n' 
u'this\nis a\ntest string\nwith embedded\nnewlines' 

注意,這消除了任何尾隨的換行符,但不應該是一個大問題。

+1

看起來不錯。有一件事:在OP中輸入是數組,而不是字符串。 – ailin

+0

@ailin:當然。我只是展示瞭如何在字符串列表被加入單個字符串之後進行清理。 OP沒有提供一個字符串樣本列表,我不想推測它的字符串的確切格式,因爲(如前所述),如果輸入列表中的字符串不是包含嵌入的換行符。 –

1

使用reduce應該工作:

reduce(lambda x,y: (x+y).replace('\n\n', '\n'), x) 

然而,正則表達式會更優雅:

re.sub('\n+', '\n', x)