2016-12-02 215 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(字符串翻譯)--->\\ --->正則表達式引擎(翻譯)--->\