Muszę wziąć ciąg zawierający symbole zastępcze do późniejszego podstawienia, na przykład:
"A %s B %s"
I zamień to w:
"A {0} B {1}"
Wymyśliłem:
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
To działa, ale wydaje się super niezręczne i wcale nie jest „idiomatycznym” pytonem.
Jak wyglądałoby dobrze idiomatyczne rozwiązanie python?
Aktualizacje w celu wyjaśnienia:
- wynikowe ciągi nie są używane w Pythonie. I zrobić potrzebne numery liczników w tam! (więc
{}
nie jest wystarczająco dobry)! - Muszę tylko dbać o
%s
ciągi, ponieważ gwarantuje się, że wiadomości będą używać tylko%s
(żadnych%i %f
)
python
python-3.x
GhostCat pozdrawia Monikę C.
źródło
źródło
Odpowiedzi:
Zrobiłbym to, co pierwotnie sugerował Reznik , a następnie przywołałbym
.format
to:źródło
%s
w tekście?Użyj
re.sub
z funkcją lambda do ponownego zastosowania podstawienia jeden raz dla każdego elementu iitertools.count
do sekwencyjnego pobierania liczb:Pamiętaj, aby zawinąć to w funkcję, aby wykonać tę operację więcej niż jeden raz, ponieważ musisz odświeżyć
itertools.count
.źródło
next(counter)
go nazwiesz , generuje następną wartość, zawsze zapominam o tym generatorze naprawdę ładna odpowiedźMyślę, że to powinno zadziałać
rv.replace('%s','{{{}}}').format(*range(rv.count('%s')))
źródło
X.join(Y.split(Z))
to po prostu zawiły sposób pisaniaY.replace(X, Z)
i nie trzeba kończyćrange
połączenialist(...)
.Używanie
re.sub
do dynamicznego zastępowania:źródło
%%s
) - jeśli jest to problem, możeszr'(?<!%)%s'
zamiast tego użyć wyrażenia regularnego .{{{}}}
właściwie chodzi?{
Nie robimy\{
tak jak zwykle{{
.Za pomocą generatora:
źródło
Czy próbowałeś z .format?
string.format (0 = wartość, 1 = wartość)
Więc:
"A {0} B {1}".format(0=value, 1=value)
źródło
%s
w{}
?