2013-11-04 207 views
1

我很難搞清楚爲什麼這段代碼不會產生匹配對象。我在Centos操作系統上運行python 2.6.6。Python 2.6正則表達式

>>> x = r'\[GOOD\]' 
>>> y = r'it made me feel \[GOOD\]' 
>>> match = re.search(x, y) 
>>> print match 
None 

我的預期產出將是一個匹配的對象,如:

>>> match = re.search ('hi', 'hilllaos') 
>>> print match 
<_sre.SRE_Match object at 0x3299ac0> 

任何解釋嗎?

回答

2

你不是找斜線:

>>> re.search(r'\[GOOD\]', 'it made me feel [GOOD]') 
<_sre.SRE_Match object at 0x00000000026C5C60> 
4
>>> x = r'\\\[GOOD\\\]' 
>>> y = r'it made me feel \[GOOD\]' 
>>> re.search(x, y) 
<_sre.SRE_Match object at 0x8aa3d40> 

\\\[第一\轉義第二(中間)削減和最後一個斜線逃脫[

在你逃避只是[即在character class正則表達式只使用\[,所以它會不匹配字符串y實際\

+0

所以你可以使用多個轉義逃避? –

+0

@ paulie.jvenuez是的。 –

1

正則表達式編譯器也解釋反斜槓,所以您的模式(x有效變爲{GOOD]。這並沒有出現在你的字符串中,所以沒有匹配。如果你想匹配一個反斜槓後跟{GOOD接着反斜線的字符串,然後],那麼你需要在模式的反斜槓和逃避特殊字符太:

x = r'\\\[GOOD\\\]' 

現在這種模式將匹配y

2
x = r'\[GOOD\]' 
print(len(x)) # prints 8 
print(x[0]) # prints a backslash 

該字符串中有反斜槓。

但是,該模式不匹配反斜槓。在正則表達式中,反斜槓修改後面的內容;在本例中,反斜槓將禁用[的特殊功能。

所以你的正則表達式只是匹配文字字符串[GOOD]。但是您的x由於反斜槓而不包含該字符串。

如果你想你的目標字符串以僅包含[GOOD]然後刪除反斜槓:

y = r'it made me feel [GOOD]' 

如果你想搜索字符串在目標字符串匹配反斜槓,您必須修改你的格局。這將工作:

x = r'..GOOD..' # use dot to match anything 

但是要真正匹配正則表達式中的反斜槓,您使用雙反斜槓。反斜槓是改變它的下一個字符一個特殊字符,因此要獲得一個反斜槓您雙擊它:

x = r'\\.GOOD.\\' match actual backslashes; use dot to match square braces 

所以你使用\\以匹配左方括號的右邊一個反斜槓和\[\]方括號。把它放在一起:

x = r'\\\[GOOD\]\\' 

但是你沒有在這裏使用正則表達式的任何特殊功能。這只是一個匹配一個文字字符串的正則表達式。

順便說一句,Python的「原始字符串」功能在這裏很方便。在普通字符串中,需要將反斜槓加倍以獲得單個反斜槓,就像在一個模式中一樣,需要將反斜槓加倍以匹配反斜槓。因此,要使用正常字符串寫入模式,需要將反斜線加倍兩倍:

x = '\\\\\\[GOOD\\]\\\\' # note not a raw string 

Yuck!