1

複数 (2 ~ 3 行) にわたるエラー メッセージがあります。それをキャッチして警告に埋め込みたい。改行をスペースに置き換えても問題ないと思います。

私の質問は、どの方法がベストプラクティスであるかということです。これが最良の質問ではないことはわかっていますが、適切にコーディングしたいと考えています。私も何かが足りないかもしれません。これまでのところ、私は3つの方法を思いつきました:

  1. 文字列.replace()
  2. 正規表現
  3. 文字列.翻訳()

私は string.translate() に傾倒していましたが、それがどのように機能するかを読んだ後、「\ n」を除くすべての文字をそれ自体に変換するのはやり過ぎだと思います。また、正規表現は、このような単純なタスクにはやり過ぎのようです。

それに指定された他の方法はありますか、それとも前述のいずれかを選択する必要がありますか? 速度よりも移植性と堅牢性に関心がありますが、それでもある程度関連性があります。

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

これは、もう 1 つの高速でポータブルなオプションです。replace とほぼ同じですが、読みにくくなります。

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 に答える