2015-06-04 11 views
5

questo è il mio codice finora:sostituire tag segnaposto con campi dizionario in Python

import re 
template="Hello,my name is [name],today is [date] and the weather is [weather]" 
placeholder=re.compile('(\[([a-z]+)\])') 
find_tags=placeholder.findall(cam.template_id.text) 
fields={field_name:'Michael',field_date:'21/06/2015',field_weather:'sunny'} 

for key,placeholder in find_tags: 
assemble_msg=template.replace(placeholder,?????) 
print assemble_msg 

voglio sostituire ogni tag con il campo dizionario associato e il messaggio finale per essere come questo: Il mio nome è Michael Oggi è il 21/06/2015 e il tempo è soleggiato. Voglio farlo automaticamente e non manualmente. Sono sicuro che la soluzione è semplice, ma non ho trovato nulla fino ad ora. Qualsiasi aiuto?

+1

Prova a eseguire questo codice e verifica se è applicabile al tuo problema: "Il mio nome è {nome}". Format (name = 'Ian') '. – IanAuld

risposta

6

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.)

+2

Questo è il modo corretto per la formattazione di questa natura. Se l'OP deve mantenere il modello: 'new_var = template.format (** fields)' e il valore del template rimarrà lo stesso. – IanAuld

+0

In realtà @tobias_k il messaggio finale non è corretto.se stampi il messaggio in ogni ciclo, vedrai che sostituisce ogni volta il tag associato, ma quando corregge il secondo tag, ad esempio, il primo è [nome] .e quando va a cambiare tag al terzo, gli altri sono [nome] e [data]. – pankar

+1

@pankar Si deve fare 'new_string = template.replace (...)'. In questo modo, usa il modello originale ogni volta. Do 'template = template.replace (...)' o 'new_string = template' e poi' new_string = new_string.replace (...) 'invece. –

1

È possibile utilizzare dizionari per inserire i dati direttamente in stringhe, in questo modo ...

fields={'field_name':'Michael','field_date':'21/06/2015','field_weather':'sunny'} 
string="Hello,my name is %(field_name)s,today is %(field_date)s and the weather is %(field_weather)s" % fields 

Questa potrebbe essere un'alternativa più semplice per te?