1

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

我该如何解决这个问题?

4

5 回答 5

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']
于 2013-05-17T03:00:15.000 回答
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
于 2013-05-17T03:11:21.777 回答
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)

这最终对可能需要的组之间的任何数量的空白行不敏感。

于 2013-05-17T03:00:40.853 回答
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 
于 2013-05-17T03:12:01.840 回答
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
于 2013-05-17T03:17:01.670 回答