Non penso che tu abbia bisogno di token.
Un modo possibile per migliorare le cose è guardare ogni carattere in input del testo (i modelli) solo una volta.
Cerca la stringa dall'inizio alla fine (una volta) e assembla una nuova stringa come segue: dall'inizio cerca {, seguito dai caratteri identificativi, quindi}. Sposta il testo della stringa prima di {nella nuova stringa, quindi cerca l'identificatore in un dizionario e sposta la sostituzione nella nuova stringa. Ricomincia a cercare {da dove avevi interrotto l'ultima volta.
In questo modo non stai effettuando la scansione del testo di input più e più volte. Potresti tokenizzare la stringa di input, ma non credo che sia d'aiuto rispetto a questo suggerimento.
Il punto qui è pensare a come le cose vanno in scala (si pensi alle descrizioni di O ()). Se alcuni modelli sono molto grandi, stai scandendo quel testo una volta per ogni operazione str.Replace. Inoltre, se il numero di variabili è molto grande, si esegue la scansione di un testo di input di grandi dimensioni tante volte quante sono le variabili. Con questo suggerimento, si esegue la scansione del testo di input solo una volta, indipendentemente dal numero di variabili.