Eu tenho que pegar uma string contendo espaços reservados para substituição posterior, como:
"A %s B %s"
E transforme isso em:
"A {0} B {1}"
Eu vim com:
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
Isso funciona, mas parece super desajeitado, e nem um pouco python "idiomático".
Como seria uma solução python bem idiomática?
Atualizações para esclarecimentos:
- as seqüências resultantes não são usadas no python. I fazer precisar os números do contador em lá! (então
{}
não é bom o suficiente)! - Eu só preciso me preocupar com
%s
seqüências de caracteres, pois as mensagens são garantidas para usar apenas%s
(não é o%i %f
que for)
python
python-3.x
GhostCat saúda Monica C.
fonte
fonte
Respostas:
Eu faria o que Reznik originalmente sugeriu e depois apelou
.format
:fonte
%s
no texto?Use
re.sub
com uma função lambda para reaplicar a substituição uma vez para cada elemento eitertools.count
para obter números sequencialmente:Lembre-se de agrupar isso em uma função para executar esta operação mais de uma vez, pois você precisará atualizar
itertools.count
.fonte
next(counter)
-lo produzir o próximo valor, eu sempre esquecer este gerador realmente resposta agradávelEu acho que esse trabalho deve
rv.replace('%s','{{{}}}').format(*range(rv.count('%s')))
fonte
X.join(Y.split(Z))
é apenas uma maneira complicada de escreverY.replace(X, Z)
e não há necessidade de encerrar arange
ligaçãolist(...)
.Usando
re.sub
para substituição dinâmica:fonte
%%s
). Se isso for um problema, você pode usar a regexr'(?<!%)%s'
.{{{}}}
realmente é?{
, não fazemos\{
como de costume{{
.Usando um gerador:
fonte
Você já tentou com .format?
string.format (0 = valor, 1 = valor)
Assim:
"A {0} B {1}".format(0=value, 1=value)
fonte
%s
em{}
?