Saya harus mengambil string yang berisi placeholder untuk substitusi nanti, seperti:
"A %s B %s"
Dan mengubahnya menjadi:
"A {0} B {1}"
Saya datang dengan:
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
Itu bekerja, tetapi rasanya super kikuk, dan sama sekali tidak python "idiomatik".
Bagaimana solusi python idiomatik yang baik?
Pembaruan untuk klarifikasi:
- string yang dihasilkan tidak digunakan dalam python. Saya lakukan perlu nomor meja di sana! (jadi
{}
tidak cukup baik)! - Saya hanya perlu peduli dengan
%s
string, karena pesan dijamin hanya akan digunakan%s
(tidak%i %f
apa pun)
python
python-3.x
GhostCat memberi hormat Monica C.
sumber
sumber
Jawaban:
Saya akan melakukan apa yang awalnya disarankan Reznik dan kemudian memanggil
.format
itu:sumber
%s
di teks?Gunakan
re.sub
dengan fungsi lambda untuk menerapkan kembali substitusi satu kali untuk setiap elemen, danitertools.count
untuk mendapatkan angka secara berurutan:Jangan lupa untuk membungkusnya dalam fungsi untuk melakukan operasi ini lebih dari sekali, karena Anda harus menyegarkan
itertools.count
.sumber
next(counter)
menghasilkan nilai berikutnya, saya selalu lupa tentang generator ini jawaban yang sangat bagusSaya pikir itu harus bekerja
rv.replace('%s','{{{}}}').format(*range(rv.count('%s')))
sumber
X.join(Y.split(Z))
hanya cara penulisan yang berbelit-belitY.replace(X, Z)
, dan tidak perlu membungkusrange
panggilan itulist(...)
juga.Menggunakan
re.sub
untuk mengganti dinamis:sumber
%%s
) - jika itu masalah, Anda bisa menggunakan regexr'(?<!%)%s'
sebagai gantinya.{{{}}}
sebenarnya terjadi?{
tidak kita lakukan\{
seperti biasa{{
.Menggunakan generator:
sumber
Sudahkah Anda mencoba dengan .format?
string.format (0 = nilai, 1 = nilai)
Begitu:
"A {0} B {1}".format(0=value, 1=value)
sumber
%s
menjadi{}
?