2013-05-17 22 views
1

分開行我想用Python來重新以下文字:加入由空行Python中

text = """17/05/2013 10:09:15,INFO,xxxxxxxxxx 
yyyyyy 
zzzzzz 

17/05/2013 10:09:15,INFO,xxxxxxxx 
yyyyyyy 
zzzzzzz""" 

他們格式轉換成

17/05/2013 10:09:15,INFO,xxxxxxxxxxyyyyyyzzzzzz 
17/05/2013 10:09:15,INFO,xxxxxxxxyyyyyyyzzzzzzz 

我嘗試這樣做:

def strip(txt): 
ret="" 
for l in txt.split("\n"): 
    if l.strip() in ['\n', '\r\n']: 
     ret = ret + "\n" 
      else: 
      ret = ret + l.strip() 
print ret 

但事實證明,代碼無法識別空行,結果如下所示:

17/05/2013 10:09:15,INFO,xxxxxxxxxxyyyyyyzzzzzz17/05/2013 
10:09:15,INFO,xxxxxxxxyyyyyyyzzzzzzz 

我該如何解決這個問題?

+0

所有'\ N'你'分裂(「\ n」)的條紋' – waitingkuo

+0

謝謝,現在我才意識到,我'做錯了 – donie

+0

我改進了jamylak的解決方案 – eyquem

回答

2
>>> import re 
>>> text = """17/05/2013 10:09:15,INFO,xxxxxxxxxx 
yyyyyy 
zzzzzz 

17/05/2013 10:09:15,INFO,xxxxxxxx 
yyyyyyy 
zzzzzzz""" 
>>> print re.sub('\n(?!\n)', '', text) 
17/05/2013 10:09:15,INFO,xxxxxxxxxxyyyyyyzzzzzz 
17/05/2013 10:09:15,INFO,xxxxxxxxyyyyyyyzzzzzzz 
+0

+1 。正則表達式真的在這裏閃耀。 –

+0

請看看我的編輯,請改善您的優良正則表達式來照顧好幾條空行。 – eyquem

4

你可以因爲二者都是由兩條新線分出的文本拆分爲兩個:

>>> mylist = text.split('\n\n') 

然後,只需打印的每張價值,擺脫一堆字母之間的新線路:

>>> for i in mylist: 
...  print i.replace('\n','') 
... 
17/05/2013 10:09:15,INFO,xxxxxxxxxxyyyyyyzzzzzz 
17/05/2013 10:09:15,INFO,xxxxxxxxyyyyyyyzzzzzzz 

或者,如果你想在每行存儲在一個列表,使用列表理解:

>>> [i.replace('\n','') for i in mylist] 
['17/05/2013 10:09:15,INFO,xxxxxxxxxxyyyyyyzzzzzz', '17/05/2013 10:09:15,INFO,xxxxxxxxyyyyyyyzzzzzzz'] 
+1

可讀的單行:'[chunk.replace('\ n','')用於text.split中的塊('\ n \ n')]' –

1

我想我可能會嘗試itertools.groupby

from itertools import groupby 
lines = text.splitlines() 
def is_blank(x): 
    return bool(x.strip()) 
print '\n'.join(''.join(v) for b,v in groupby(lines,is_blank) if b) 

這最終是不敏感,這可能是可取的羣體之間的任何數量的空行。

1

如果爲regular expressions感覺很舒服:

In [5]: import re 
In [6]: print re.sub('[^\n]\n', '', text) 
17/05/2013 10:09:15,INFO,xxxxxxxxxyyyyyzzzzz 
17/05/2013 10:09:15,INFO,xxxxxxxyyyyyyzzzzzzz 
0
import re 

text = """17/05/2013 10:09:15,INFO,xxxxxxxxxx 
yyyyyy 
zzzzzz 

17/05/2013 10:09:15,INFO,xxxxxxxx 
yyyyyyy 
zzzzzzz""" 

pat = '(\d\d/\d\d/\d{4} \d\d:\d\d:\d\d,INFO,.*)\n(.*)\n(.*)' 
regx = re.compile(pat) 

print text 
print '\n===================\n' 
print '\n'.join('%s,%s,%s' % x for x in regx.findall(text)) 

編輯

jamylak的解決方案是比我好。但是,正則表達式可以如下消除幾個空行繼承加以改進:

>>> import re 
>>> text = """17/05/2013 10:09:15,INFO,xxxxxxxxxx 
yyyyyy 
zzzzzz 





17/05/2013 10:09:15,INFO,xxxxxxxx 
yyyyyyy 
zzzzzzz""" 
>>> print re.sub('(?<=\n)\n+(?=\n)|\n(?!\n)', '', text) 
17/05/2013 10:09:15,INFO,xxxxxxxxxxyyyyyyzzzzzz 
17/05/2013 10:09:15,INFO,xxxxxxxxyyyyyyyzzzzzzz 
+0

-0。過於複雜的一個簡單的任務。另外,如果行格式不正確,他們會默默消失。 –

+0

@Steven你完全正確。我的想法如下:1 /如果OP用這種開頭寫這些行,那是因爲他不希望在不同的路線上完成治療2 /只要OP將有治療的代碼換句話說,如果他意識到它是不夠有效的(例如在某些地方添加''s *''''''''''''''''''將會改進自己的正則表達式模式。因爲我覺得總是想着代替提問者去思考他們自己並不認爲的所有特殊情況。 – eyquem

+0

@Steven這個想法很愚蠢:基於假設(1)和非明確意見(2)。而且,我的解決方案非常重要。順便說一下,這也是錯誤的,因爲我在結果中輸入逗號,而OP不需要。 Jamylak的解決方案更加輕便優雅。它的隱含思想是OP的文本只包含他寫的行,或者如果在其文本中有其他類型的行(不以時間開始,我的意思是),他可以接受治療無論如何,關注所有線路。我暗含的想法是愚蠢的,偶然的(...繼續...) – eyquem