2016-12-02 177 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

小心点,你差点召唤噬魂者Ba'al – wim

+1

@wim - “差不多”?然后,我应该反斜杠。 – TigerhawkT3

0
r'string' 

原料

尝试注释您正则表达式的字符串

这里是相同的重新的使用和不使用生注释

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


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

这是考虑的,因为python3

+0

你能解释一下什么是内部发生了什么? – MYGz

+0

不如TFM https://docs.python.org/3.4/library/re.html?highlight=raw%20string – tomc

+0

点符合除新行之外的任何内容。您的目标字符串'\ $'不是换行符,因此它匹配。 – tomc

-1

你h大使用。如。匹配除换行符以外的任何字符。

2

您应该使用这个功能re.escape()

逃生(字符串)

返回字符串的所有非字母数字反斜线;如果你想匹配一个任意的文字字符串,那么它是有用的 ,该字符串中可能有常规的 表达式元字符。

例如:

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

它输出:

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

这相当于什么他answer提到@TigerhawkT3

1

在(非原始)字符串文字中,反斜杠是特殊的。这意味着Python解释器应该专门处理以下字符。例如"\n"是包含换行符的长度为1的字符串。 "\$"是一个单个字符的字符串,即美元符号。 "\\$"是两个字符的字符串:反斜杠和美元符号。

在正则表达式中,反斜杠还意味着以下字符需要专门处理,但一般而言,特殊含义不同。在正则表达式中,$与行尾相匹配,并且\$与美元符号匹配,\\匹配单个反斜杠,而\\$匹配行尾的反斜杠。

所以,当你做re.match('\$',s) Python解释读取'\$'来构造字符串对象$(即,长度为1)然后传递该字符串对象到re.match。使用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字符串和正则表达式引擎中转义。

Python字符串会将2 \\转换为1 \。和正则表达式引擎将需要2 \\匹配1 \

所以提供正则表达式引擎与2 \\为了配合1 \我们将在Python字符串使用4 \\\\

\\\\ - >的Python(字符串翻译)--->\\ --->正则表达式引擎(翻译)--->\