1

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

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

  1. string.replace()
  2. 正则表达式
  3. string.translate()

我倾向于 string.translate(),但是在阅读了它的工作原理之后,我认为将除“\ n”之外的每个字符都转换为自身是一种矫枉过正的做法。对于这样一个简单的任务,Regexp 似乎也有点过头了。

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

4

4 回答 4

4

只需使用以下replace方法:

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

这是最简单的解决方案。使用正则表达式是多余的,也意味着你必须导入。 translate稍微好一点,但仍然没有给出任何没有的东西replace(当然除了更多的打字)。

replace也应该跑得更快。

于 2013-08-14T17:46:02.573 回答
3

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

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

笔记:

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

意思是:

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

与替换换行符相比,拆分行的一个好处是您可以过滤掉不需要的行,即避免日志中的混乱。例如,如果您有以下输出traceback.format_exc()

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

而且您只需要将最后一行添加到您的日志中:

import traceback
try:
    1/0
except: # of course you wouldn't catch exceptions like this in real code
    print traceback.format_exc().splitlines()[-1]
    # prints: ZeroDivisionError: integer division or modulo by zero

以供参考:

于 2013-08-14T17:57:17.607 回答
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
于 2013-08-14T17:47:27.233 回答
0

这应该适用于 Windows 和 Linux。

string.replace('\r\n', ' ').replace('\n', ' ')
于 2013-08-14T17:49:07.623 回答