正規表現はどのように宣言すればよいですか?
mergedData = re.sub(r'\$(.*?)\$', readFile, allData)
なぜこれが機能したのか、ちょっと不思議です。r''
を使用して正規表現を渡す必要があると考えました。
mergedData = re.sub("\$(.*?)\$", readFile, allData)
この場合、どのような"\$"
結果になりますか? なんで?私は思ったでしょう"$"
。
正規表現を渡すには r'' を使用する必要があると思いました。
r
文字列リテラルが生の文字列を示す前に、または などの通常のエスケープ シーケンスが\n
改行\r
文字またはキャリッジ リターンとして扱われなくなり、単にorが\
続くことを意味します。を指定するには、生の文字列リテラルでのみ必要ですが、通常の文字列リテラルでは 2 倍にする必要があります。これが、通常、正規表現1を指定する際に生の文字列が使用される理由です。コードを読むときの混乱を減らします。通常の文字列リテラルを使用する場合は、エスケープを 2 回行う必要があります。1 回目は通常の文字列リテラルのエスケープで、2 回目は正規表現でのエスケープです。n
r
\
\
\\
"\$"
この場合、どのような結果になりますか? なんで?と思っただろう"$"
Python の通常の文字列リテラルで\
は、エスケープ シーケンスが後に続かない場合、\
が保持されます。したがって"\$"
、結果\
は$
.
この動作は、C/C++ または JavaScript が同様の状況を処理する方法とは少し異なります\
。次の文字のエスケープと見なされ、次の文字だけが残ります。したがって"\$"
、これらの言語では として解釈され$
ます。
脚注
1 : ただし、Python の生の文字列の設計には小さな欠陥があります。なぜ Python の生の文字列リテラルは単一のバックスラッシュで終了できないのですか?
(正規表現の最初のグループへの参照ですが、エスケープされていない場合は ' と同じです) のようなr'...'
エスケープ シーケンス。'\1'
'\x01
一般的に言えばr'...'
、バックスラッシュはエスケープ文字として動作しません。
試す
re.split('(.).\1', '1x2x3') # ['1x2x3']
対。
re.split(r'(.).\1', '1x2x3') # ['1', 'x', '3']
は python のエスケープ シーケンスではないため'\$'
、文字どおり'\\$'
.
ヘビに聞いてみてください:
>>> r'\$(.*?)\$'=='\$(.*?)\$'
True
>>> r'\vert'=='\vert'
False
>>> r'\123'=='\123'
False
>>> r'\#23'=='\#23'
True
基本的\x
に、C で esacped 文字を作成する場合、文字列プレフィックスで r を使用することは、次と同じ\\x
です。
>>> r'\123'=='\\123'
True
>>> r'\tab'=='\\tab'
True