だから私はこれを理解することができないようです...私は"a\\nb"
という文字列があり、これを"a\nb"
にしたいです。次のすべてを試しましたが、どれも機能していないようです。
>>> a
'a\\nb'
>>> a.replace("\\","\")
File "<stdin>", line 1
a.replace("\\","\")
^
SyntaxError: EOL while scanning string literal
>>> a.replace("\\",r"\")
File "<stdin>", line 1
a.replace("\\",r"\")
^
SyntaxError: EOL while scanning string literal
>>> a.replace("\\",r"\\")
'a\\\\nb'
>>> a.replace("\\","\\")
'a\\nb'
これがうまくいくので、私は最後の1つがなぜ働くのか本当に理解していません:
>>> a.replace("\\","%")
'a%nb'
ここに欠けているものはありますか?
[〜#〜] edit [〜#〜] \はエスケープ文字であることを理解しています。私がここでやろうとしているのは、すべての\\n
\\t
などを\n
\t
などに変換し、置き換えが思ったように機能していないようですします。
>>> a = "a\\nb"
>>> b = "a\nb"
>>> print a
a\nb
>>> print b
a
b
>>> a.replace("\\","\\")
'a\\nb'
>>> a.replace("\\\\","\\")
'a\\nb'
文字列aを文字列bのように見せたい。しかし、replaceは、思っていたようなスラッシュの置き換えではありません。
このためにreplaceを使用する必要はありません。
あなたが持っているのはエンコードされた文字列です(string_escape
エンコーディング)そして、あなたはそれをデコードしたい:
>>> s = r"Escaped\nNewline"
>>> print s
Escaped\nNewline
>>> s.decode('string_escape')
'Escaped\nNewline'
>>> print s.decode('string_escape')
Escaped
Newline
>>> "a\\nb".decode('string_escape')
'a\nb'
In Python 3:
>>> import codecs
>>> codecs.decode('\\n\\x21', 'unicode_escape')
'\n!'
あなたは行方不明です、その\はエスケープ文字です。
ここをご覧ください: http://docs.python.org/reference/lexical_analysis.html at 2.4.1 "エスケープシーケンス"
最も重要なことは、\ nは改行文字です。そして、\\はエスケープされたエスケープ文字です:D
>>> a = 'a\\\\nb'
>>> a
'a\\\\nb'
>>> print a
a\\nb
>>> a.replace('\\\\', '\\')
'a\\nb'
>>> print a.replace('\\\\', '\\')
a\nb
元の文字列、a = 'a\\nb'
には実際には2つの'\'
文字、最初の文字は後者のエスケープです。もしあなたがそうするなら、 print a
、実際には1つだけであることがわかります'\'
キャラクター。
>>> a = 'a\\nb'
>>> print a
a\nb
ただし、'\n'
を改行文字として、スラッシュをエスケープせずに:
>>> b = a.replace('\\n', '\n')
>>> b
'a\nb'
>>> print b
a
b
これは、「生の」文字列(=開始引用符の前にr
を含む文字列)であっても、エスケープされていないエスケープ文字を文字列の最後の文字にすることができないためです。これは代わりに動作するはずです:
'\\ '[0]
Python文字列リテラルでは、バックスラッシュはエスケープ文字です。これは、対話型プロンプトが文字列の値を表示するときにも当てはまります。文字列のリテラルコード表現を提供します。 print
ステートメントは、文字列が実際にどのように見えるかを確認します。
この例は違いを示しています:
>>> '\\'
'\\'
>>> print '\\'
\
r'a\\nb'.replace('\\\\', '\\')
または
'a\nb'.replace('\n', '\\n')