Ладно, у меня полусухая проблема с re.sub.
Возьмите следующий код:
import re
str_to_be_subbed = r'somefile.exe -i <INPUT>'
some_str = r'C:\foobar'
s = re.sub(r'\<INPUT\>', some_str, str_to_be_subbed)
print s
Я бы подумал, что это даст мне:
somefile.exe -i C:\\foobar
Но вместо этого он дает мне:
somefile.exe -i C:♀oobar
Я знаю, что \ f является escape-символом, но даже если я попытаюсь сделать это таким образом, это должно ускользнуть от специальных персонажей. Даже если я сделаю это:
print r'%s' % s
Это все еще дает мне это:
somefile.exe -i C:♀oobar
Почему он это делает? И какой лучший способ избежать этого?
Ниндзя Править:
Если я посмотрю на значение s, то оно будет:
'somefile.exe -i C:\x0coobar'
Почему \ f превратилось в \ x0. Тьфу.
Edit:
Еще один вопрос, если я изменю код следующим образом:
import re
import os
str_to_be_subbed = r'somefile.exe -i <INPUT>'
some_str = os.path.abspath(r'C:\foobar')
some_str
s = re.sub(r'\<INPUT\>', some_str, str_to_be_subbed)
print s
дает мне:
>>> import re
>>> import os
>>> str_to_be_subbed = r'somefile.exe -i <INPUT>'
>>> some_str = os.path.abspath(r'C:\foobar')
>>> some_str
'C:\\foobar'
>>> s = re.sub(r'\<INPUT\>', some_str, str_to_be_subbed)
>>> print s
somefile.exe -i C:♀oobar
Теперь, почему это так? Поскольку os.path.abspath избегает \ 'ы. Почему re.sub все еще портит?
Также это очень маленький пример этой маленькой проблемы, которая случайно возникала в старом приложении. Я не могу пойти и изменить это на string.replace из-за того, как он настроен, не тратя целый день.
Мне просто очень интересно, почему он это делает. Для вышеуказанной проблемы.