Я должен взять строку, содержащую заполнители для последующей замены, например:
"A %s B %s"
И превратить это в:
"A {0} B {1}"
Я придумал:
def _fix_substitution_parms(raw_message):
rv = raw_message
counter = 0
while '%s' in rv:
rv = rv.replace('%s', '{' + str(counter) + '}', 1)
counter = counter + 1
return rv
Это работает, но это кажется очень неуклюжим, и вовсе не «идиоматическим» питоном.
Как бы хорошо, идиоматическое решение Python выглядело?
Обновления для уточнения:
- Результирующие строки не используются в Python. Я делать нужно число счетчиков в там! (так
{}
не достаточно хорошо)! - Мне нужно заботиться только о
%s
строках, так как сообщения гарантированно использовать только%s
(ни в коем случае%i %f
)
python
python-3.x
GhostCat приветствует Монику С.
источник
источник
Ответы:
Я бы сделал то, что изначально предлагал Резник, а затем позвонил бы по этому поводу
.format
:источник
%s
в тексте?Используйте
re.sub
с лямбда-функцией для повторного применения подстановки один раз для каждого элемента иitertools.count
для последовательного получения чисел:Не забудьте заключить это в функцию, чтобы выполнить эту операцию более одного раза, так как вам нужно будет обновить
itertools.count
.источник
next(counter)
его называете, выдает следующее значение, я всегда забываю об этом генераторе - действительно хороший ответЯ думаю, что работа должна
rv.replace('%s','{{{}}}').format(*range(rv.count('%s')))
источник
X.join(Y.split(Z))
это просто запутанный способ написанияY.replace(X, Z)
, и нет необходимости заключатьrange
вызовlist(...)
.Использование
re.sub
для динамической замены:источник
%%s
) - если это проблема, вы можетеr'(?<!%)%s'
вместо этого использовать регулярное выражение .{{{}}}
самом деле?{
мы не делаем\{
как обычно, мы делаем{{
.Используя генератор:
источник
Вы пробовали с .format?
string.format (0 = значение, 1 = значение)
Так:
"A {0} B {1}".format(0=value, 1=value)
источник
%s
в{}
?