Tengo que tomar una cadena que contenga marcadores de posición para una sustitución posterior, como:
"A %s B %s"
Y convertir eso en:
"A {0} B {1}"
Se me ocurrio:
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
Eso funciona, pero se siente súper torpe, y en absoluto pitón "idiomático".
¿Cómo sería una solución de pitón bien idiomática?
Actualizaciones para aclaraciones:
- Las cadenas resultantes no se utilizan en Python. Yo hago necesitar los números del contador de allí! (¡entonces
{}no es lo suficientemente bueno!) - Solo necesito preocuparme por las
%scadenas, ya que los mensajes están garantizados para usar solo%s(sin ningún%i %ftipo)
python
python-3.x
GhostCat saluda a Monica C.
fuente
fuente

Respuestas:
Haría lo que Reznik sugirió originalmente y luego invocaría
.formateso:fuente
%sen el texto?Úselo
re.subcon una función lambda para volver a aplicar la sustitución una vez para cada elemento, yitertools.countpara obtener números secuencialmente:Recuerde incluir esto en una función para realizar esta operación más de una vez, ya que necesitará actualizar
itertools.count.fuente
next(counter)producir el siguiente valor, siempre me olvido de esta respuesta realmente agradable del generadorCreo que debería funcionar
rv.replace('%s','{{{}}}').format(*range(rv.count('%s')))fuente
X.join(Y.split(Z))es solo una forma enrevesada de escribirY.replace(X, Z), y tampoco es necesario ajustar larangellamadalist(...).Utilizando
re.subpara el reemplazo dinámico:fuente
%%s): si eso es una preocupación, puede usar la expresión regular en sur'(?<!%)%s'lugar.{{{}}}realidad?{no hacemos lo que hacemos\{habitualmente{{.Usando un generador:
fuente
¿Has probado con .format?
string.format (0 = valor, 1 = valor)
Entonces:
"A {0} B {1}".format(0=value, 1=value)fuente
%sen{}?