Ich muss eine Zeichenfolge mit Platzhaltern für eine spätere Ersetzung verwenden, z.
"A %s B %s"
Und machen Sie daraus:
"A {0} B {1}"
Ich hatte die Idee dass:
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
Das funktioniert, aber es fühlt sich super klobig an und überhaupt nicht "idiomatisch" Python.
Wie würde eine gute, idiomatische Python-Lösung aussehen?
Aktualisierungen zur Klarstellung:
- Die resultierenden Zeichenfolgen werden in Python nicht verwendet. Ich tun die Zählernummern dort brauchen! (also
{}
nicht gut genug)! - Ich muss mich nur um
%s
Strings kümmern , da die Nachrichten garantiert nur verwendet werden%s
(%i %f
überhaupt nicht).
python
python-3.x
GhostCat begrüßt Monica C.
quelle
quelle
Antworten:
Ich würde tun, was Reznik ursprünglich vorgeschlagen hatte, und dann darauf zurückgreifen
.format
:quelle
%s
im Text haben?Verwendung
re.sub
mit einer Lambda-Funktion zum erneuten Anwenden der Substitution für jedes Element unditertools.count
zum sequentiellen Abrufen von Zahlen:Denken Sie daran, dies in eine Funktion zu verpacken, um diesen Vorgang mehrmals auszuführen, da Sie eine Aktualisierung durchführen müssen
itertools.count
.quelle
next(counter)
, produzieren Sie den nächsten Wert, ich vergesse immer über diesen Generator wirklich schöne AntwortIch denke, das sollte funktionieren
rv.replace('%s','{{{}}}').format(*range(rv.count('%s')))
quelle
X.join(Y.split(Z))
ist nur eine verschlungene SchreibweiseY.replace(X, Z)
, und es besteht auch keine Notwendigkeit, denrange
Anruflist(...)
einzuschließen.Verwenden
re.sub
für dynamisches Ersetzen:quelle
%%s
). Wenn dies ein Problem darstellt, können Sier'(?<!%)%s'
stattdessen den regulären Ausdruck verwenden.{{{}}}
eigentlich?{
wir nicht\{
wie gewöhnlich{{
.Verwendung eines Generators:
quelle
Haben Sie es mit .format versucht?
string.format (0 = Wert, 1 = Wert)
Damit:
"A {0} B {1}".format(0=value, 1=value)
quelle
%s
in{}
?