Oft muss ich dieselbe Zeichenfolge mehrfach ersetzen:
(format "%s %s %s" "a" "a" "a") ;; gives: "a a a"
(es ist nur ein Dummy-Beispiel, in diesem Fall ist es besser, "a" mit einem Leerzeichen zu kleben, aber im Allgemeinen befasse ich mich mit komplizierteren Situationen)
Gibt es eine Möglichkeit, eine benannte Ersetzung vorzunehmen? Zum Beispiel würde man in Python schreiben:
"{0} {0} {0}".format("a") # or:
"{name} {name} {name}".format(name="a")
Antworten:
Das Umschreiben dieser Antwort ergibt eine andere Lösung:
Edit : Eine andere
format-spec
LösungMalabarba gibt in Kommentaren eine andere Lösung:
Edit 2 : Bewertung vor der Substitution:
Hier einige Beispiele mit Bewertung vor der Substitution:
quelle
format-spec-make
nur eine Liste ist:'((?a . "a") (?b . "b"))
Die String-Manipulationsbibliothek von Magnar Sveen an el bietet eine Vielzahl von Möglichkeiten, dies zu tun. Beispielsweise:
Beachten Sie, dass
s-format
jede replacer Funktion übernehmen können, sondern bietet eine spezielle Handhabung füraget
,elt
undgethash
. Sie könnten also eine Liste von Tokens verwenden und sie nach Index referenzieren, wie folgt:Sie können auch in-scope-Variablen wie folgt ersetzen:
quelle
Das s-lex-Format von sel ist genau das, was Sie wollen, aber wenn Sie in der Lage sein möchten, Code in die Substitutionsblöcke und nicht nur in Variablennamen einzufügen, habe ich dies als Proof of Concept geschrieben.
Sie können sogar einen
fmt
Anruf in einen anderen einbetten,fmt
wenn Sie verrückt sindDer Code wird nur zu einem
format
Aufruf erweitert, sodass alle Ersetzungen der Reihe nach ausgeführt und zur Laufzeit ausgewertet werden.Es könnte verbessert werden, welcher Formattyp verwendet wird, anstatt immer% s zu verwenden. Dies müsste jedoch zur Laufzeit erfolgen und würde zusätzlichen Aufwand verursachen. Dies könnte jedoch dadurch erreicht werden, dass alle Formatierungsargumente in einem Funktionsaufruf zusammengefasst werden, der die Dinge gut formatiert on type aber wirklich das einzige szenario, in dem du das willst, ist wahrscheinlich floats und du könntest sogar ein (format "% f" float) in der ersetzung machen, du warst verzweifelt.
Wenn ich mehr dran arbeite, aktualisiere ich eher diesen Kern als diese Antwort. https://gist.github.com/jordonbiondo/c4e22b4289be130bc59b
quelle
Kein allgemeiner Zweck, löst aber Ihren Fall:
Anhand des bereitgestellten Beispiels:
gibt:
quelle
" * - :raw-html:`<img width=\"100%%\" src=\"http://xxx.xxx/images/languages/staff/%s.jpg\" alt=\"%s.jpg\"/>` - .. _%s:"
- Alle%s
sind gleich.