Подзадачи регулярных выражений - PullRequest
3 голосов
/ 22 мая 2009

Ладно, у меня полусухая проблема с 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 из-за того, как он настроен, не тратя целый день.

Мне просто очень интересно, почему он это делает. Для вышеуказанной проблемы.

Ответы [ 4 ]

3 голосов
/ 22 мая 2009

Не используйте регулярные выражения:

print str_to_be_subbed.replace("<INPUT>",some_str)

Как указано в документации :

repl может быть строкой или функцией; если это строка, любая обратная косая черта уходит в нем обрабатываются.

3 голосов
/ 22 мая 2009

\f - это символ подачи . Побег, и это работает:

some_str = r'C:\\foobar'

Другое решение:

s = re.sub(r'<INPUT>', some_str.encode("string_escape"), str_to_be_subbed)
2 голосов
/ 29 января 2013

Документы Python говорят ...

re.sub (pattern, repl, string, count = 0, flags = 0) Вернуть строку, полученную путем замены самого левого неперекрывающегося вхождения шаблона в строке заменой repl. Если шаблон не найден, строка возвращается без изменений. repl может быть строкой или функцией; если это строка, любые экранированные символы в ней обрабатываются. То есть \ n преобразуется в один символ новой строки, \ r преобразуется в возврат каретки и т. Д. Неизвестные побеги, такие как \ j, остаются одни

Вот почему он дает 'C: ♀oobar'.

но если мы дадим ему функцию в качестве второго аргумента, он не преобразует экранирование от обратной косой черты.

Так что попробуйте следующее ..

>>>import re
>>>str_to_be_subbed = r'somefile.exe -i <INPUT>'
>>>some_str = r'C:\foobar'
>>>s = re.sub(r'\<INPUT\>', lambda _:some_str, str_to_be_subbed)
>>>print s
somefile.exe -i c:\foobar
0 голосов
/ 22 мая 2009

Вашему примеру не нужны регулярные выражения, используйте str.replace():

>>> str_to_be_subbed.replace('<INPUT>',some_str)
'somefile.exe -i C:\\foobar'
>>> 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...