2016-12-02 10 views
1

リテラル文字列 '\ $'と一致させようとしています。私はバックスラッシュで '\'と '$'の両方をエスケープしています。パターンでバックスラッシュをエスケープすると、なぜ動作しないのですか?しかし、もし私がドットを使用すると、それは動作します。

import re 

print re.match('\$','\$') 
print re.match('\\\$','\$') 
print re.match('.\$','\$') 

出力:

None 
None 
<_sre.SRE_Match object at 0x7fb89cef7b90> 

は、誰かが内部で何が起こっているのか説明できますか?

答えて

3

残念ながら、さらにバックスラッシュが必要です。文字列中のリテラルであることを示すためにエスケープし、正規表現の特殊文字の代わりにリテラルであることを示すためにそれらをエスケープする必要があります。これは、生の文字列が正規表現によく使われる理由です。バックスラッシュは爆発しません。

>>> import re 
>>> print re.match('\$','\$') 
None 
>>> print re.match('\\\$','\$') 
None 
>>> print re.match('.\$','\$') 
<_sre.SRE_Match object at 0x01E1F800> 
>>> print re.match('\\\\\$','\$') 
<_sre.SRE_Match object at 0x01E1F800> 
>>> print re.match(r'\\\$','\$') 
<_sre.SRE_Match object at 0x01E1F800> 
+2

慎重に、あなたはほとんどバアル・ザ・ソウル・イーターを召喚しました – wim

+1

@wim - "ほぼ"?私はバックスラッシュしなければなりません。 – TigerhawkT3

0
r'string' 

ここにあなたの正規表現文字列

に注釈を付ける文字列

試みは、これが理由のアカウントでのpython3ある

print(re.match(r'\\\$', '\$')) 
<_sre.SRE_Match object; span=(0, 2), match='\\$'> 


print(re.match('\\\$', '\$')) 
None 

生注釈付きとなしの再年代同じです

+0

あなたは内部で何が起こっているか説明できますか? – MYGz

+0

TFMではなくhttps://docs.python.org/3.4/library/re.html?highlight=raw%20string – tomc

+0

ドットは新しい行に一致します。あなたのターゲット文字列 '\ $'は改行ではないので一致します。 – tomc

-1

あなたはhです使用するave。 as。改行を除くすべての文字に一致します。

2

あなたはこのためにre.escape()機能を使用する必要があります。

エスケープ(文字列)非英数字は、バックスラッシュすべてと

戻り文字列。通常の 表現メタ文字が含まれている任意のリテラル文字列と一致させる場合は、 が便利です。例えば

import re 
val = re.escape('\$') # val = '\\\$' 
print re.match(val,'\$') 

これは、出力:

<_sre.SRE_Match object; span=(0, 2), match='\\$'> 

これは@TigerhawkT3は彼のanswerで述べたものに相当します。

1

(非生の)文字列リテラルでは、バックスラッシュは特別です。これは、Pythonインタプリタが特別な文字の後に処理する必要があることを意味します。たとえば、"\n"は、改行文字を含む長さ1の文字列です。 "\$"は、ドル記号の1文字の文字列です。 "\\$"は、バックスラッシュとドル記号の2つの文字列です。

正規表現では、バックスラッシュは次の文字が特別に扱われることを意味しますが、一般的に特殊な意味が異なります。正規表現では、$は行末に一致し、\$はドル記号に一致し、\\は単一のバックスラッシュに一致し、\\$は行の末尾にあるバックスラッシュに一致します。

あなたがre.match('\$',s)を行うときに、Pythonインタプリタは、re.matchにその文字列オブジェクトを渡す文字列オブジェクト$(すなわち、長さ1)を構築するために'\$'を読み込みます。 re.match('\\$',s)でPythonは文字列オブジェクト\$(長さ2)を作成し、その文字列オブジェクトをre.matchに渡します。

re.matchに実際に渡されている内容を確認するには、印刷してください。例:

pat = '\\$' 
print "pat :" + pat + ":" 
m = re.match(pat, s) 

通常、人は生の文字列リテラルを使用して、バックスラッシュの二重の意味を避けます。

pat = r'\$' # same 2-character string as above 
0

上記のお返事ありがとうございます。私は上記の答えに短いサマリーがないので、私はこの答えを追加しています。

バックスラッシュ\は、python stringとregex engineの両方でエスケープする必要があります。

Python文字列は、2 \\を1 \に変換します。そして、正規表現エンジンは、我々はPythonの文字列に4 \\\\を使用する必要があります1 \を一致させるために2 \\で正規表現エンジンを提供するので、1 \

に一致するように2 \\が必要になります。

\\\\ - >パイソン(文字列変換)--->\\ --->正規表現エンジン(翻訳)--->\