Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python-re.sub中的奇怪行为_Python_Regex - Fatal编程技术网

Python-re.sub中的奇怪行为

Python-re.sub中的奇怪行为,python,regex,Python,Regex,以下是我正在运行的代码: 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'somethi

以下是我正在运行的代码:

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 Server@\DTS\Binn\DTExec.exe something
为什么会有@符号?

您正在混合原始(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

RE引擎正在将
REPLACE_TERM
中的
\100
视为八进制转义码。您需要避开反斜杠,以便按需要处理。

为什么在替换术语中需要r'和双反斜杠?是因为它认为替换项是一个正则表达式吗?但我已经摆脱了反斜杠。为什么我要逃避两次呢?你在逃避Python的反斜杠。您仍然需要为
re
引擎转义它,这样它就不会被认为是一个反向引用或八进制转义序列。