1. ホーム
  2. パイソン

[解決済み】文字列フラグ "u "と "r "は一体何をするのでしょうか、そして生の文字列リテラルとは何でしょうか?

2022-03-23 10:21:09

質問

質問中 この質問 私は、生の文字列についてあまり知らないことに気づきました。Django のトレーナーであることを主張する者にとって、これは最悪です。

エンコーディングが何であるかは知っています。 u'' のみで、何がUnicodeなのかがわかるので。

  • しかし、何をするかというと r'' は具体的に何をするのでしょうか?どのような文字列になるのでしょうか?

  • そしてなによりも、一体何のために ur'' はどうするのですか?

  • 最後に、Unicode 文字列から単純な生の文字列に戻る、信頼できる方法はありますか?

  • あ、ちなみに、システムとテキストエディタの文字コードがUTF-8に設定されている場合は u'' 実際に何かをするのですか?

どのように解決するのですか?

特にありません。 文字列 があります。 文字列リテラル でマークされた文字列リテラルと同じです。 'r' を開始引用符の前に置く。

"生文字列リテラル"は、文字列リテラルの構文が少し異なり、その中にバックスラッシュがあります。 \ 改行、タブ、バックスペース、フォームフィードなどを表すエスケープシーケンスもありません。 通常の文字列リテラルでは、エスケープシーケンスの開始とみなされないように、各バックスラッシュを2重にする必要があります。

この構文のバリエーションが存在するのは、正規表現パターンの構文がバックスラッシュを多用し(ただし最後には使わないので、上記の "except" 節は関係ない)、それぞれを二重にしない方が見た目が少し良くなる -- それだけである。 また、(他のプラットフォームのように通常のスラッシュの代わりにバックスラッシュで)Windowsネイティブのファイルパスを表現することも人気がありましたが、これは非常に稀で(Windowsでも通常のスラッシュはほとんど正常に機能するため)不完全です(上記の "except" 節があるため)。

r'...' はバイト文字列です(Python 2.*の場合)。 ur'...' はUnicode文字列(これもPython 2.*の場合)、他の3種類のクォートも全く同じ種類の文字列を生成します(したがって、例えば r'...' , r'''...''' , r"..." , r"""...""" はすべてバイト列、といった具合に)。

とはどういう意味ですか? バック という文字列は存在しないので、本質的に戻る方向と進む方向はありません。 タイプ これは、バイトやユニコードなど、ごく普通の文字列オブジェクトを表現するための代替構文に過ぎないのです。

そして、そう、Python 2.*では。 u'...' とは常に区別されます。 '...' -- 前者はユニコード文字列で、後者はバイト文字列です。前者はユニコード文字列、後者はバイト文字列です。リテラルがどのようなエンコーディングで表現されるかは、完全に独立した問題です。

例:(Python 2.6)を考えてみましょう。

>>> sys.getsizeof('ciao')
28
>>> sys.getsizeof(u'ciao')
34

もちろん、Unicodeオブジェクトはより多くのメモリ空間を必要とします(非常に短い文字列に対しては、明らかに非常に小さな違いです;-)。