781

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

私はエンコーディングとは何かを知っており、u''ユニコードとは何かを知っているので、それだけで何ができるかを知っています。

  • しかし、r''正確には何をしますか?どのような文字列になりますか?

  • そして何よりも、一体何をするのur''ですか?

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

  • ところで、システムとテキスト エディタの文字セットが UTF-8 に設定されている場合、u''実際には何もしないのでしょうか?

4

7 に答える 7

802

実際には「生の文字列」はありません。生の文字列リテラル'r'があります。これは、開始引用符の前にマークされた文字列リテラルです。

「生の文字列リテラル」は、文字列リテラルとは少し異なる構文であり、バックスラッシュ ,\は「単なるバックスラッシュ」を意味するものと見なされます (リテラルを終了する引用符の直前にある場合を除く) -- いいえ改行、タブ、バックスペース、フォームフィードなどを表す「エスケープ シーケンス」。通常の文字列リテラルでは、エスケープ シーケンスの開始と見なされないように、各バックスラッシュを 2 つにする必要があります。

この構文バリアントが存在する主な理由は、正規表現パターンの構文がバックスラッシュで重く (ただし、最後に決してないため、上記の "except" 句は重要ではありません)、それぞれを二重にするのを避けると、少し見栄えがよくなります - - それで全部です。また、ネイティブの Windows ファイル パス (他のプラットフォームのような通常のスラッシュの代わりにバックスラッシュを使用) を表現することもある程度人気を博しましたが、それが必要になることはほとんどなく (通常のスラッシュは Windows でもほとんど問題なく動作するため)、不完全です ("except" 句のため)。その上)。

r'...'はバイト文字列 (Python 2.* の場合)、は Unicode 文字列 (Python 2.* の場合) であり、他の 3 種類の引用符のいずれも、まったく同じタイプの文字列をur'...'生成します (たとえばr'...'、、、、はすべてバイト文字列など)。r'''...'''r"..."r"""..."""

「戻る」とはどういう意味かわかりません-生の文字列がないため、本質的に前後の方向はありません。完全に通常の文字列オブジェクト、バイトまたはユニコードを表現するための代替構文にすぎません。

もちろん、Python 2.* では、u'...' 常にjust とは異なり'...'ます。前者は Unicode 文字列で、後者はバイト文字列です。リテラルがどのエンコーディングで表現されるかは、完全に直交する問題です。

たとえば、(Python 2.6) を考えてみましょう:

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

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

于 2010-01-17T16:38:39.220 に答える
206

strPython には、伝統的なタイプと新しいタイプの 2 種類の文字列がありますunicode。前に を付けずに文字列リテラルを入力すると、8 ビット文字を格納uする古い型が取得され、前に を付けると、任意の Unicode 文字を格納できる新しい型が取得されます。struunicode

r型はまったく変更されません。文字列リテラルの解釈方法が変更されるだけです。がない場合r、バックスラッシュはエスケープ文字として扱われます。,rバックスラッシュはリテラルとして扱われます。いずれにせよ、タイプは同じです。

urもちろん、バックスラッシュがエスケープコードの一部ではなく、リテラルのバックスラッシュである Unicode 文字列です。

関数を使用して Unicode 文字列を古い文字列に変換しようとすることはできますがstr()、古い文字列で表現できない Unicode 文字がある場合、例外が発生します。必要に応じて最初にクエスチョン マークに置き換えることもできますが、当然、これらの文字が読めなくなります。strUnicode 文字を正しく処理したい場合は、この型を使用することはお勧めしません。

于 2010-01-17T16:26:17.340 に答える
70

「生の文字列」は、表示どおりに保存されることを意味します。たとえば、はエスケープではなく'\'単なるバックスラッシュです。

于 2012-03-06T01:21:38.443 に答える
38

「u」接頭辞は、値がunicodeではなく型を持つことを示しますstr

"r" プレフィックスを持つ生の文字列リテラルは、その中のエスケープ シーケンスをエスケープしますlen(r"\n")。2 も同様です。これらはエスケープ シーケンスをエスケープするため、単一のバックスラッシュで文字列リテラルを終了することはできません。これは有効なエスケープ シーケンスではありません (例: r"\")。

「Raw」は型の一部ではなく、値を表す 1 つの方法にすぎません。たとえば、"\\n"とは、 、、 とr"\n"同じように同一の値です。320x200b100000

Unicode の生の文字列リテラルを使用できます。

>>> u = ur"\n"
>>> print type(u), len(u)
<type 'unicode'> 2

ソース ファイルのエンコーディングは、ソース ファイルの解釈方法を決定するだけで、式や型には影響しません。ただし、ASCII 以外のエンコーディングで意味が変わるコードは避けることをお勧めします。

ASCII (または Python 3.0 の場合は UTF-8) を使用するファイルには、コーディング Cookie を含めないでください。Latin-1 (または UTF-8) は、コメントまたはドキュメント文字列で、Latin-1 を必要とする著者名を言及する必要がある場合にのみ使用してください。それ以外の場合は、\x、\u、または \U エスケープを使用して、文字列リテラルに非 ASCII データを含めることをお勧めします。

于 2010-01-17T16:25:51.447 に答える
5

これは明らかかもしれませんが、そうでないかもしれませんが、x=chr(92)を呼び出すことで文字列'\'を作成できます。

x=chr(92)
print type(x), len(x) # <type 'str'> 1
y='\\'
print type(y), len(y) # <type 'str'> 1
x==y   # True
x is y # False
于 2017-05-15T07:37:24.807 に答える