Zarkonnenの回答はあなたの質問に答えますが、直接ではありません. もっと率直に言って、ザルコネンから賞金を手に入れることができるか見てみましょう。
「生の文字列正規表現」および「生の文字列パターン」という用語の使用をやめると、おそらくこれを理解しやすくなるでしょう。これらの用語は、Python ソース コードでの特定の文字列の表現と、その文字列が表す正規表現という 2 つの異なる概念を混同しています。
実際、これらをそれぞれ独自の構文を持つ 2 つの異なるプログラミング言語と考えると役に立ちます。Python 言語には、とりわけ、特定の内容の文字列を構築し、正規表現システムを呼び出すソース コードがあります。正規表現システムには、文字列オブジェクトに常駐するソース コードがあり、文字列と一致します。どちらの言語もバックスラッシュをエスケープ文字として使用します。
まず、文字列は一連の文字であることを理解してください (つまり、バイトまたは Unicode コード ポイント。ここでは区別はあまり重要ではありません)。Python ソース コードで文字列を表現する方法は多数あります。生の文字列は、これらの表現の 1 つにすぎません。2 つの表現が同じ文字シーケンスになる場合、それらは同等の動作を生成します。
バックスラッシュ文字の後にn文字が続く2 文字の文字列を想像してください。バックスラッシュの文字値が 92 で、nの文字値が 110 であることがわかっている場合、この式は文字列を生成します。
s = chr(92)+chr(110)
print len(s), s
2 \n
従来の Python 文字列表記"\n"
では、この文字列は生成されません。代わりに、改行文字を含む 1 文字の文字列を生成します。Python ドキュメント2.4.1 . 文字列リテラルは、「バックスラッシュ (\) 文字は、改行、バックスラッシュ自体、または引用符文字など、特別な意味を持つ文字をエスケープするために使用されます。」
s = "\n"
print len(s), s
1
(この例では改行が表示されていませんが、注意深く見ると、「1」の後に空白行があることに注意してください。)
2 文字の文字列を取得するには、別のバックスラッシュ文字を使用して、元のバックスラッシュ文字の特別な意味をエスケープする必要があります。
s = "\\n"
print len(s), s
2 \n
多くのバックスラッシュ文字を含む文字列を表現したい場合はどうしますか? Python ドキュメント2.4.1。文字列リテラルは続けます。生の文字列表現を使用した 2 文字の文字列を次に示します。
s = r"\n"
print len(s), s
2 \n
したがって、3 つの異なる文字列表現があり、すべてが同じ文字列または文字列を示します。
print chr(92)+chr(110) == "\\n" == r"\n"
True
さて、正規表現に移りましょう。Python ドキュメント、7.2. re
—正規表現操作では、「正規表現ではバックスラッシュ文字 ('\') を使用して、特別な形式を示したり、特別な意味を呼び出さずに特殊文字を使用できるようにしたりします。これは、Python で同じ目的のために同じ文字を使用することと衝突します。文字列リテラル...」
改行文字に一致する Python 正規表現オブジェクトが必要な場合は、バックスラッシュ文字の後にn文字が続く 2 文字の文字列が必要です。次のコード行はすべて、改行文字を認識する正規表現オブジェクトに prog を設定します。
prog = re.compile(chr(92)+chr(110))
prog = re.compile("\\n")
prog = re.compile(r"\n")
では、 「通常、パターンはこの生の文字列表記を使用して Python コードで表現される」のはなぜでしょうか。? 正規表現は多くの場合静的文字列であり、文字列リテラルとして便利に表現されるためです。また、使用可能なさまざまな文字列リテラル表記のうち、正規表現にバックスラッシュ文字が含まれている場合は、生の文字列が便利な選択肢です。
質問
Q : 表情はre.compile(r"\s\tWord")
?A : 正規表現のコンパイルから文字列を分離し、別々に理解することで理解しやすくなります。
s = r"\s\tWord"
prog = re.compile(s)
文字列には、バックスラッシュ、s、バックスラッシュ、t、および 4 つの文字のs
8 文字が含まれます。Word
Q : タブとスペース文字はどうなりますか? A : Python 言語レベルでは、文字列にタブとスペースs
文字はありません。バックスラッシュ、s、バックスラッシュ、tの4 文字で始まります。一方、正規表現システムは、その文字列を正規表現言語のソース コードとして扱います。つまり、「空白文字、タブ文字、および 4 つの文字で構成される文字列に一致する.Word
Q : バックラッシュ s とバックスラッシュ t として扱われている場合、それらをどのように一致させますか? A : 'you' と 'that' という言葉をより具体的にすると、質問がより明確になるかもしれません。「任意の空白文字」および「タブ文字」として。
Q : または、バックスラッシュ-n-改行の 3 文字の文字列がある場合はどうなりますか? A : Python 言語では、3 文字の文字列 backslash-n-newline は、従来の string "\\n\n"
、または raw と従来の string r"\n" "\n"
、またはその他の方法で表すことができます。正規表現システムは、2 つの連続した改行文字が見つかった場合、3 文字の文字列 backslash-n-newline と一致します。
注: すべての例とドキュメントの参照は Python 2.7 に対するものです。
更新: @Vladislav Zorov と @m.buettner の回答、および @Aerovistae のフォローアップの質問からの説明を組み込みました。