2010-05-24 47 views
1

这里奇怪的行为是我运行代码:Python的 - 在应用re.sub

import re 

FIND_TERM = r'C:\\Program Files\\Microsoft SQL Server\\90\\DTS\\Binn\\DTExec\.exe' 
rfind_term = re.compile(FIND_TERM,re.I) 

REPLACE_TERM = 'C:\\Program Files\\Microsoft SQL Server\\100\\DTS\\Binn\\DTExec.exe' 

test = r'something C:\Program Files\Microsoft SQL Server\90\DTS\Binn\DTExec.exe something' 

print rfind_term.sub(REPLACE_TERM,test) 

而结果我得到的是:

something C:\Program Files\Microsoft SQL [email protected]\DTS\Binn\DTExec.exe something 

为什么会有一个@符号?

回答

1

的RE发动机治疗REPLACE_TERM\100为八进制转义码。您需要避开反斜杠,以便按照需要进行处理。

+1

但我已经逃避了反斜杠。为什么我需要两次逃脱? – Greg 2010-05-24 20:36:56

+0

您正在逃避Python的反斜杠。您仍然需要为're'引擎转义它,以便它不被视为反向引用或八进制转义序列。 – 2010-05-24 20:48:26

2

你在混合raw(r'')和普通字符串。

>>> FIND_TERM = r'C:\\Program Files\\Microsoft SQL Server\\90\\DTS\\Binn\\DTExec\.exe' 
>>> REPLACE_TERM = r'C:\\Program Files\\Microsoft SQL Server\\100\\DTS\\Binn\\DTExec.exe' 
>>> rfind_term = re.compile(FIND_TERM,re.I) 
>>> test = r'something C:\Program Files\Microsoft SQL Server\90\DTS\Binn\DTExec.exe something' 
>>> print rfind_term.sub(REPLACE_TERM,test) 
something C:\Program Files\Microsoft SQL Server\100\DTS\Binn\DTExec.exe something 
+1

为什么你需要r'和替换字词中的双后挡号?是因为它认为替换术语是一个正则表达式吗? – Greg 2010-05-24 20:08:46

+0

是的,完全是这样的:http://docs.python.org/library/re.html – pycruft 2010-05-26 21:30:38