2013-11-04 159 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!