去除单个换行但保留多个换行的最佳方法

5 投票
1 回答
1524 浏览
提问于 2025-04-17 23:54

怎样用最“Python风格”的方法来去掉字符串中的单个换行符,但保留多个换行符呢?

比如说,

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

想要变成

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

我在想可以用splitlines()方法,然后把空行替换成"\n",最后再把所有内容拼接回去,但我觉得可能还有更好更简单的方法。也许可以用正则表达式?

1 个回答

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

当然,如果你不在乎 Mac 的行结束符(因为这种情况很少见),可以去掉 |\r

撰写回答