Non c'è bisogno di una soluzione manuale utilizzando le espressioni regolari. Questo è (in un formato leggermente diverso) già sostenuto da str.format
:
>>> template = "Hello, my name is {name}, today is {date} and the weather is {weather}"
>>> fields = {'name': 'Michael', 'date': '21/06/2015', 'weather': 'sunny'}
>>> template.format(**fields)
Hello, my name is Michael, today is 21/06/2015 and the weather is sunny
Se non è possibile modificare la stringa template
di conseguenza, si può facilmente sostituire il []
con {}
in una fase di pre-elaborazione. Notare che ciò aumenterà un valore di KeyError
nel caso in cui uno dei segnaposto non sia presente nel codice fields
.
Nel caso in cui si desidera mantenere il vostro approccio manuale, si potrebbe provare in questo modo:
template = "Hello, my name is [name], today is [date] and the weather is [weather]"
fields = {'field_name': 'Michael', 'field_date': '21/06/2015', 'field_weather': 'sunny'}
for placeholder, key in re.findall('(\[([a-z]+)\])', template):
template = template.replace(placeholder, fields.get('field_' + key, placeholder))
O un po 'più semplice, senza usare le espressioni regolari:
for key in fields:
placeholder = "[%s]" % key[6:]
template = template.replace(placeholder, fields[key])
Successivamente, template
è la nuova stringa con sostituzioni. Se è necessario conservare il modello, è sufficiente creare una copia di tale stringa ed eseguire la sostituzione in tale copia. In questa versione, se un segnaposto non può essere risolto, rimane nella stringa. (Si noti che ho scambiato il significato di key
e placeholder
nel ciclo, perché secondo me ha più senso in questo modo.)
Prova a eseguire questo codice e verifica se è applicabile al tuo problema: "Il mio nome è {nome}". Format (name = 'Ian') '. – IanAuld