2012-05-03 19 views
22

Me gustaría obtener algunas opiniones sobre la mejor manera de reemplazar una subcadena de una cadena con algún otro texto. Aquí hay un ejemplo:Reemplazar una subcadena de una cadena con Python

Tengo una cadena, una, que podría ser algo así como "Hola, mi nombre es $ nombre". También tengo otra cadena, b, que quiero insertar en la cadena a en el lugar de su subcadena '$ nombre'.

Supongo que sería más fácil si la variable reemplazable se indica de alguna manera. Usé un signo de dólar, pero podría ser una cuerda entre llaves o lo que creas que funcionaría mejor.

Solución: Así es como decidí hacerlo:

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

Me gustaría preguntar a reconsiderar utilizar el método de formato estándar si el formato $ sustitutos no es unchangeble a { } –

Respuesta

55

Estas son las formas más comunes de hacerlo:

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

El método que utiliza string.Template es fácil de aprender y debe ser familiar para golpear a los usuarios. Es adecuado para exponer a los usuarios finales. Este estilo estuvo disponible en Python 2.4.

El percent-style será familiar para muchas personas procedentes de otros lenguajes de programación. Algunas personas encuentran que este estilo es propenso a errores debido a la "s" posterior en %(name)s, porque% -operator tiene la misma precedencia que la multiplicación, y porque el comportamiento de los argumentos aplicados depende de su tipo de datos (tuplas y dicts obtienen manejo especial). Este estilo ha sido soportado en Python desde el principio.

El curly-bracket style solo es compatible con Python 2.6 o posterior. Es el estilo más flexible (que proporciona un amplio conjunto de caracteres de control y permite a los objetos implementar formateadores personalizados).

+16

@kwikness - Estoy bastante seguro Raymond aludía a [Guido van Rossum] (http://en.wikipedia.org/wiki/Guido_van_Rossum) (pyth creador de on y BDFL (dictador benevolente de por vida)), Tim Peters ([TimSort] (http://en.wikipedia.org/wiki/Timsort) fama, escribió [Zen of Python] (http://stackoverflow.com/questions/228181/the-zen-of-python)), y [Barry Warsaw] (http://barry.warsaw.us/) (grande en python/jython - por ejemplo, en este [broma de los inocentes] (http : //www.python.org/dev/peps/pep-0401/) El tío Barry se convirtió en FLUFL (lenguaje amigable tío de por vida). –

8

Pedido la función replace() en Python. Aquí hay un enlace:

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

Esto debería ser útil cuando se trata de sustituir un texto que ha especificado. Por ejemplo, en el enlace que te muestran lo siguiente:

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

para cada palabra "is", sería sustituirla por la palabra "was".

+3

Este es en realidad un buen ejemplo de por qué str.replace * no * lo que quiere el OP: "this" se convertirá en "thwas" :) (gracias, no hay puntos y comas innecesarios) –

11

Hay varias maneras de hacerlo, la más comúnmente utilizada sería a través de las instalaciones ya provistas por las cadenas. Eso significa el uso del operador %, o mejor aún, el más nuevo y recomendado str.format().

Ejemplo:

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

o más simplemente

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

También puede utilizar argumentos posicionales:

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

O con índices explícitos:

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

que le permite cambiar el orden de los campos en la cadena sin cambiar la llamada a format():

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

El formato es muy potente. Puede usarlo para decidir qué tan ancho debe hacer un campo, cómo escribir números y otro tipo de formato, dependiendo de lo que escriba dentro de los corchetes.

También puede usar la función str.replace(), o expresiones regulares (desde el módulo re) si los reemplazos son más complicados.

2

También puede usar el formato con% pero .format() se considera más moderno.

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

pero también es compatible con alguna comprobación de tipos, como se conoce a partir de costumbre% de formato:

>>> '%(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 
Cuestiones relacionadas