2014-03-26 52 views
2

删除单个换行符但保留字符串中多个换行符的最好方法是什么?删除单个换行符但保留多个换行符的最佳方式

正如

"foo\n\nbar\none\n\rtwo\rthree\n\n\nhello"

变成

"foo\n\nbar one two three\n\n\nhello"

我想使用splitlines(),然后通过"\n"更换空行,然后再返回串联的一切,但我怀疑有更好/更简单的方法。也许使用正则表达式?

回答

3
>>> re.sub('(?<![\r\n])(\r?\n|\n?\r)(?![\r\n])', ' ', s) 
'foo\n\nbar one two three\n\n\nhello' 

这看起来为\r?\n\n?\r并使用回顾后和向前断言,以防止从那里被在任一侧上一个新行。

对于它的价值,有三种类型的行结束在野外发现:

  1. \n在Linux,Mac OS X和其他Unix系统
  2. \r\n在Windows,并在HTTP协议
  3. \r在Mac OS 9和早期

前两个是目前最常见的。如果你想限制的可能性,只是这三个,你可以这样做:

>>> re.sub('(?<![\r\n])(\r?\n|\r)(?![\r\n])', ' ', s) 
'foo\n\nbar one two three\n\n\nhello' 

和当然,摆脱|\r的,如果你不关心Mac产品线的结局,这是罕见的。

+0

谢谢,这看起来不错。但现在我正在阅读,我不认为寻找“\ r \ n”或甚至单个“\ r”是很有意义的。也许唯一明智的换行符是'\ n'和''\ n \ r''。是对的吗?如果是这样,你还可以为简单的情况提供正则表达式吗? –