将结束行'\ n'替换为字符串中的空格的好方法

时间:2013-08-14 17:44:27

标签: python string replace

我有一条跨越多条(2-3)行的错误消息。我想抓住它并嵌入一个警告。我认为将新行替换为空格是可以的。

我的问题是,哪种方法是最佳做法。我知道这不是最好的问题,但我想正确编码。我也可能会遗漏一些东西。到目前为止,我已经提出了3种方法:

  1. 与string.replace()
  2. 正则表达式
  3. string.translate()
  4. 我倾向于使用string.translate(),但是在阅读它是如何工作之后,我认为除了'\ n'之外,将每个角色都隐藏起来是一种过度杀伤力。 Regexp对于这么简单的任务来说似乎也是一种过度杀伤。

    是否指定了其他任何方法,或者我应该选择上述方法之一?我关心的是可移植性和稳健性而不是速度,但它仍然有些相关。

4 个答案:

答案 0 :(得分:4)

只需使用replace方法:

>>> "\na".replace("\n", " ")
' a'
>>>

这是最简单的解决方案。使用Regex是过度的,也意味着你必须导入。 translate稍微好一些,但仍然没有提供replace没有的任何内容(当然除了更多的输入外)。

replace也应该跑得更快。

答案 1 :(得分:3)

如果您想将所有这些实现细节留给python实现,您可以这样做:

s = "This\nis\r\na\rtest"
print " ".join(s.splitlines())
# prints: This is a test

注意:

  

此方法使用通用换行符方法分割行。

这意味着:

  

通用换行符一种解释文本流的方式,其中所有以下内容都被识别为一行:Unix行尾约定'\n',Windows约定{{ 1}}和旧的Macintosh约定'\r\n'。有关其他用途,请参阅PEP 278和PEP 3116以及'\r'

分割线条比替换换行符的好处是可以过滤掉不需要的线条,即避免日志混乱。例如,如果您的输出为str.splitlines()

traceback.format_exc()

并且您只需要在日志中添加最后一行:

Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
ZeroDivisionError: integer division or modulo by zero

供参考:

答案 2 :(得分:1)

这是另一种快速/便携式选择。它与替换或多或少相同,但不太可读

errMsg = """Something went wrong
            This message is long"""

" ".join(errMsg.splitlines())

有了计时结果,虽然我保证根据邮件长度会有所不同

>>> s = """\
' '.join('''Something went wrong
            This message is long'''.splitlines())"""

>>> timeit.timeit(stmt=s, number=100000)
0.06071170746817329

>>> q = """'''\
Something went wrong
This message is long'''.replace("\\n",' ')"""

>>> timeit.timeit(stmt=q, number=100000)
0.049164684830429906

答案 3 :(得分:0)

这应该适用于Windows和Linux。

string.replace('\r\n', ' ').replace('\n', ' ')