加入Python中用空行分隔的行

时间:2013-05-17 02:57:11

标签: python string

我想使用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

我该如何解决这个问题?

5 个答案:

答案 0 :(得分: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 :(得分: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

答案 2 :(得分: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)

这最终对组之间的任何数量的空行不敏感,这可能是期望的。

答案 3 :(得分: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 

答案 4 :(得分: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