Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中连接由空行分隔的行_Python_String - Fatal编程技术网

在Python中连接由空行分隔的行

在Python中连接由空行分隔的行,python,string,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 我试过这个: de

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

如何解决此问题?

您可以将文本一分为二,因为两个文本都由两行新行分隔:

>>> 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']

您可以将文本拆分为两个,因为两个文本都由两行新行分隔:

>>> 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']
我想我可以试试itertools.groupby:

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

我想我可以试试itertools.groupby:

>>> 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

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

如果您对正则表达式感到满意:

>>> 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

如果您对正则表达式感到满意:

编辑 贾米拉克的解决方案比我的好。但是可以对regex模式进行如下改进,以消除多个空行的连续性:

>>> 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
编辑 贾米拉克的解决方案比我的好。但是可以对regex模式进行如下改进,以消除多个空行的连续性:

>>> 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

所有的\n都被你的分割分割了'\n'谢谢,现在我意识到我做错了什么我改进了jamylak的解决方案所有的\n都被你的分割分割了'\n'谢谢,现在我意识到我做错了什么我改进了jamylak的解决方案一个可读的一行程序:[chunk.replace'\n',for chunk in text.split'\n\n']一个可读的一行程序:[chunk.replace'\n',用于文本中的chunk.split'\n\n']-0.对于一个简单的任务来说太复杂了。而且,如果行的格式不完全正确,它们会自动消失。@Steven你完全正确。我的想法是:1/如果OP以这种开头写这些行,那是因为他不希望对不同的行进行处理2/只要OP有一个新的开始用于处理换行符的代码,如果他意识到正则表达式模式是不够的,他会改进自己,例如在某些地方添加\s*;因为我发现对于所有他们不认为自己是对的特殊情况,总是代替提问者思考很累。@Steven这个想法很愚蠢:基于假设1另外,我的解决方案很重,这是对的。顺便说一句,这也是错误的,因为我在结果中加了逗号,而OP不需要任何逗号。Jamylak的解决方案更加轻巧和优雅。它基于一个隐含的想法,即OP的文本只由他写的那类行组成,或者如果有其他行的话我的意思是,在它的文本中,他可以处理所有的行。我的隐含想法是愚蠢的,碰巧…继续…@Steven…继续…偶然或正确的隐含想法,Jamylak的一个不被认为是不合适的。好吧,下一次,我将不回答这个问题我要精确,否则我会努力找到一个像Jamylak一样聪明的解决方案。这就是生活。@Steven我感谢你的评论,以及你公平的不否决票。我将对你的5个答案进行投票,你可以通过查看评论和投票的时间来验证这一点。-0。对于一项简单的任务来说太复杂了。另外,如果行没有格式d完全正确,它们悄无声息地消失了。@Steven你完全正确。我的想法是:1/如果OP用这种开头写这些行,那是因为他不想对不同的行进行处理2/只要OP有了处理新行的代码,他就会改进自己的正则表达式pa如果他意识到这是不够的,例如在某些地方加上“*”;因为我发现总是代替提问者思考所有他们自己并不认为的特殊情况很累。@Steven这个想法很愚蠢:基于一个假设1和一个不明确的意见2。此外,我的解决方案是正确的它很重。顺便说一句,这也是错误的,因为我在结果中加了逗号,而OP不需要任何逗号。Jamylak的解决方案更轻、更优雅。它基于这样一种隐含的想法,即OP的文本只由他写的那类行组成,或者如果有其他类型的行没有以时间开头,我的意思是在文本中,他可以不管怎么说,这种治疗方法涉及到所有的线条。我的隐含想法很愚蠢,碰巧…继续…@Steven…继续…偶然或正确的隐含想法,Jamylak的一个并不被认为是不合适的。好吧,下次,我不会以不够精确的方式回答这个问题,否则我会试图找到一个像on一样聪明的解决方案
杰米拉克的e。这就是生活。@Steven我感谢你的评论,以及你公平的不否决票。我将向上投票你的答案中的5个,你可以通过查看此评论和投票次数来验证这一点。请看我的编辑,我改进了你的精细正则表达式模式以处理多个空行。请看我的编辑,我改进了你的精细正则表达式模式以处理多个空行。