Reemplazar una subcadena de una cadena con Python

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:

Tengo una cadena, a, 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 '$name'.

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 cadena 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')

preguntado el 03 de mayo de 12 a las 18:05

Me gustaría pedir que se reconsidere el uso del método de formato estándar si el formato $ para los sustitutos no se puede cambiar a {} -

6 Respuestas

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 enfoque usando cadena.Plantilla es fácil de aprender y debería ser familiar para los usuarios de bash. Es adecuado para exponer a los usuarios finales. Este estilo estuvo disponible en Python 2.4.

El sistema porcentaje de estilo será familiar para muchas personas que vienen de otros lenguajes de programación. Algunas personas consideran que este estilo es propenso a errores debido a la "s" final en %(name)s, porque el operador % tiene la misma precedencia que la multiplicación y porque el comportamiento de los argumentos aplicados depende de su tipo de datos (las tuplas y los dictados tienen un manejo especial). Este estilo ha sido compatible con Python desde el principio.

El sistema estilo corchetes solo se admite en Python 2.6 o posterior. Es el estilo más flexible (proporciona un amplio conjunto de caracteres de control y permite que los objetos implementen formateadores personalizados).

contestado el 03 de mayo de 12 a las 19:05

@kwikness: estoy bastante seguro de que Raymond se refería a Guido van Rossum (creador de Python y BDFL (dictador benevolente de por vida)), Tim Peters (TimSort fama, escribió Zen de Python), y barry varsovia (grande en python/jython - por ejemplo, en este broma del día de los inocentes El tío Barry se convirtió en FLUFL (tío de lengua amigable para toda la vida). - Dr. Jimbob

Hay varias formas de hacerlo, la más utilizada sería a través de las facilidades que ya brindan las cadenas. Eso significa el uso de la % 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 mas simplemente

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

También puedes usar 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)

Lo 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 realmente poderoso. Puede usarlo para decidir qué tan ancho hacer un campo, cómo escribir números y otros formatos similares, según lo que escriba dentro de los corchetes.

También podrías usar el str.replace() función, o expresiones regulares (del re módulo) si los reemplazos son más complicados.

contestado el 03 de mayo de 12 a las 19:05

Revisa la función replace() en python. Aquí hay un enlace:

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

Esto debería ser útil al intentar reemplazar algún texto que haya especificado. Por ejemplo, en el enlace te muestran esto:

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

por cada palabra "is", lo reemplazaría con la palabra "was".

Respondido 08 Jul 15, 22:07

Este es en realidad un buen ejemplo de por qué str.replace es no lo que quiere el OP: "esto" se convertirá en "thwas" :) (por favor, no use puntos y comas innecesarios, gracias) - Merwok

En realidad esto ya está implementado en el módulo. string.Template.

contestado el 03 de mayo de 12 a las 18:05

Puedes hacer algo como:

"My name is {name}".format(name="Name")

Es compatible de forma nativa en python, como puede ver aquí:

http://www.python.org/dev/peps/pep-3101/

contestado el 03 de mayo de 12 a las 18:05

También puede usar 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 algunas comprobaciones de tipo conocidas por el formato de % habitual:

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

contestado el 03 de mayo de 12 a las 18:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.