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
%s
cadenas, ya que los mensajes están garantizados para usar solo%s
(sin ningún%i %f
tipo)
python
python-3.x
GhostCat saluda a Monica C.
fuente
fuente
Respuestas:
Haría lo que Reznik sugirió originalmente y luego invocaría
.format
eso:fuente
%s
en el texto?Úselo
re.sub
con una función lambda para volver a aplicar la sustitución una vez para cada elemento, yitertools.count
para 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 larange
llamadalist(...)
.Utilizando
re.sub
para 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
%s
en{}
?