2012-05-03 40 views
22

Mi piacerebbe avere qualche opinione sul modo migliore per sostituire una sottostringa di una stringa con un altro testo. Ecco un esempio:Sostituzione di una sottostringa di una stringa con Python

Ho una stringa, a, che potrebbe essere qualcosa come "Ciao il mio nome è $ nome". Ho anche un'altra stringa, b, che voglio inserire nella stringa a al posto della sua sottostringa '$ name'.

Suppongo che sarebbe più semplice se la variabile sostituibile è indicata in qualche modo. Ho usato un segno di dollaro, ma potrebbe essere una stringa tra parentesi graffe o qualsiasi cosa tu ritenga che avrebbe funzionato meglio.

Soluzione: Ecco come ho deciso di farlo:

from string import Template 


message = 'You replied to $percentageReplied of your message. ' + 
    'You earned $moneyMade.' 

template = Template(message) 

print template.safe_substitute(
    percentageReplied = '15%', 
    moneyMade = '$20') 
+1

vorrei chiedere di riconsiderare usare il metodo formato standard se il formato di $ per i sostituti non è unchangeble a { } –

risposta

55

Qui ci sono i modi più comuni per farlo:

>>> import string 
>>> t = string.Template("Hello my name is $name") 
>>> print t.substitute(name='Guido') 
Hello my name is Guido 

>>> t = "Hello my name is %(name)s" 
>>> print t % dict(name='Tim') 
Hello my name is Tim 

>>> t = "Hello my name is {name}" 
>>> print t.format(name='Barry') 
Hello my name is Barry 

L'approccio usando string.Template è facile da imparare e dovrebbe essere familiare per colpire gli utenti. È adatto all'esposizione agli utenti finali. Questo stile è diventato disponibile in Python 2.4.

Il percent-style sarà familiare a molte persone provenienti da altri linguaggi di programmazione. Alcune persone ritengono che questo stile sia soggetto a errori a causa della "s" finale di %(name)s, perché il% -operator ha la stessa precedenza della moltiplicazione e poiché il comportamento degli argomenti applicati dipende dal loro tipo di dati (le tuple e le dict diventano trattamento speciale). Questo stile è stato supportato in Python sin dall'inizio.

Il curly-bracket style è supportato solo in Python 2.6 o versioni successive. È lo stile più flessibile (fornisce un set completo di caratteri di controllo e consente agli oggetti di implementare i formattatori personalizzati).

+16

@kwikness - Sono abbastanza sicuro Raymond alludeva a [Guido van Rossum] (http://en.wikipedia.org/wiki/Guido_van_Rossum) (pyth on's creator e BDFL (benevolo dittatore per la vita)), Tim Peters ([TimSort] (http://en.wikipedia.org/wiki/Timsort) fama, ha scritto [Zen of Python] (http://stackoverflow.com)/questions/228181/the-zen-of-python)), e [Barry Warsaw] (http://barry.warsaw.us/) (grande in python/jython - ad esempio, in questo [scherzo di April fools] (http : //www.python.org/dev/peps/pep-0401/) Uncle Barry è diventato FLUFL (amichevole zio linguistico per la vita). –

8

Checkout la funzione replace() in python. Ecco un link:

http://www.tutorialspoint.com/python/string_replace.htm

Questo dovrebbe essere utile quando si cerca di sostituire un testo che è stato specificato. Per esempio, nel link vi mostrano questo:

str = "this is string example....wow!!! this is really string" 
print str.replace("is", "was") 

Per ogni parola "is", sarebbe sostituirlo con la parola "was".

+3

Questo è in realtà un buon esempio del motivo per cui str.replace è * non * ciò che l'OP vuole: "questo" diventerà "thwas" :) (per favore nessun punto e virgola non necessario, grazie) –

11

Ci sono diversi modi per farlo, il più comunemente usato sarebbe attraverso le strutture già fornite dalle stringhe. Ciò significa l'uso dell'operatore % o, meglio ancora, il più recente e consigliato str.format().

Esempio:

a = "Hello my name is {name}" 
result = a.format(name=b) 

O più semplicemente

result = "Hello my name is {name}".format(name=b) 

È inoltre possibile utilizzare gli argomenti di posizione:

result = "Hello my name is {}, says {}".format(name, speaker) 

O con indici espliciti:

result = "Hello my name is {0}, says {1}".format(name, speaker) 

che consente di cambiare l'ordine dei campi nella stringa senza cambiare la chiamata a format():

result = "{1} says: 'Hello my name is {0}'".format(name, speaker) 

Format è davvero potente. Puoi usarlo per decidere quanto è ampio fare un campo, come scrivere numeri e altre formattazioni del genere, a seconda di cosa scrivi all'interno delle parentesi.

È anche possibile utilizzare la funzione str.replace() o le espressioni regolari (dal modulo re) se le sostituzioni sono più complicate.

2

È anche possibile utilizzare la formattazione con% ma .format() è considerato più moderno.

>>> "Your name is %(name)s. age: %(age)i" % {'name' : 'tom', 'age': 3} 
'Your name is tom' 

ma supporta anche un certo tipo di controllo come noto dal solito% formattazione:

>>> '%(x)i' % {'x': 'string'} 

Traceback (most recent call last): 
    File "<pyshell#40>", line 1, in <module> 
    '%(x)i' % {'x': 'string'} 
TypeError: %d format: a number is required, not str 
Problemi correlati