Pythonのバックスラッシュの話

Pythonの文字列とRaw文字列でのバックスラッシュの動作を調べました。Pythonのバージョンは3.4です。

文字列におけるバックスラッシュ

バックスラッシュは直後の文字に対するエスケープシーケンスとしてよく使用されます。Pythonの文字列でのバックスラッシュを見てみると、このようになります。代入して、変数の中身を標準出力に出力して、文字数を数えています。

>>> s = '\\'; s; len(s)
'\\'
1

バックスラッシュの直後にくるバックスラッシュをエスケープしています。しかし面白いことに(厄介なことに)出力時にもバックスラッシュが二つ出力されてしまっています。しかしlen関数を用いて文字数を数えることにより、実際にはバックスラッシュが一つしかないことが分かります。

>>> s = '\;'; s; len(s)
'\\;'
2

先の例の通りなら、ここではバックスラッシュが、その後に続くセミコロンのエスケープシーケンスとして働くはずです。しかしセミコロンはエスケープの必要のない文字であるため、自動的にバックスラッシュをエスケープするバックスラッシュが加えられます。そのため、文字数はバックスラッシュとコロンで2となります。

>>> s = '\n'; s; len(s)
'\n'
1

この例は最初の例と同じですが、一応確認しておきます。nは改行を表すので、バックスラッシュは素直にエスケープシーケンスとしてのみ働いています。

>>> s = '\'; s; len(s)
  File "<input>", line 1
    s = '\'; s; len(s)
                     ^
SyntaxError: EOL while scanning string literal

これはバックスラッシュが直後の'をエスケープしてしまったため、構文エラーです。

Raw文字列におけるバックスラッシュ

Raw文字列は文字列にrまたはRを加えることにより使用できるPythonの文字列表現です。Raw文字列ではバックスラッシュが自動的にエスケープされます。

>>> s = r'\\'; s; len(s)
'\\\\'
2

バックスラッシュが自動的にエスケープされたため、文字数が2になっています。

>>> s = r'\;'; s; len(s)
'\\;'
2

さきの例では自動的にバックスラッシュが加えられていた;は、Raw文字列でもまったく同じ結果が得られます。

>>> s = r'\n'; s; len(s)
'\\n'
2

Raw文字列を使用すると、nのような表現は使用できなくなります。

>>> s = r'\'; s; len(s)
  File "<input>", line 1
    s = r'\'; s; len(s)
                      ^
SyntaxError: EOL while scanning string literal

自動的にエスケープされるタイミングの問題でしょうか、通常の文字列を使用した場合と同様に構文エラーになってしまいます。

コメント

2015 - 2017 (c) 成瀬基樹