Je dois prendre une chaîne contenant des espaces réservés pour une substitution ultérieure, comme:
"A %s B %s"
Et transformez cela en:
"A {0} B {1}"
Je suis venu avec:
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
Cela fonctionne, mais il se sent super maladroit, et pas du tout python "idiomatique".
À quoi ressemblerait une solution de python idiomatique?
Mises à jour pour clarification:
- les chaînes résultantes ne sont pas utilisées dans python. Je fais besoin des numéros de compteur là - dedans! (donc ça
{}
ne suffit pas)! - J'ai seulement besoin de me soucier des
%s
chaînes, car les messages sont garantis pour n'utiliser que%s
(pas du%i %f
tout)
python
python-3.x
GhostCat salue Monica C.
la source
la source
Réponses:
Je ferais ce que Reznik a suggéré à l' origine , puis j'appellerais
.format
cela:la source
%s
dans le texte?À utiliser
re.sub
avec une fonction lambda pour réappliquer la substitution une fois pour chaque élément etitertools.count
pour obtenir des nombres séquentiellement:N'oubliez pas de mettre cela dans une fonction pour effectuer cette opération plusieurs fois, car vous devrez actualiser
itertools.count
.la source
next(counter)
, produisez la valeur suivante, j'oublie toujours ce générateur vraiment une bonne réponseJe pense que ça devrait marcher
rv.replace('%s','{{{}}}').format(*range(rv.count('%s')))
la source
X.join(Y.split(Z))
est juste une façon compliquée d'écrireY.replace(X, Z)
, et il n'est pas nécessaire non plus de terminer l'range
appellist(...)
.Utilisation
re.sub
pour le remplacement dynamique:la source
%%s
) - si c'est un problème, vous pouvez utiliser l'expression régulière à lar'(?<!%)%s'
place.{{{}}}
réellement?{
nous échapper ne fait pas\{
comme d'habitude{{
.À l'aide d'un générateur:
la source
Avez-vous essayé avec .format?
string.format (0 = valeur, 1 = valeur)
Donc:
"A {0} B {1}".format(0=value, 1=value)
la source
%s
en{}
?