我想使用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 :(得分: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