Reemplazar una subcadena de una cadena con Python
Frecuentes
Visto 24,269 veces
23
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')
6 Respuestas
56
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
11
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
9
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
8
En realidad esto ya está implementado en el módulo. string.Template
.
contestado el 03 de mayo de 12 a las 18:05
5
Puedes hacer algo como:
"My name is {name}".format(name="Name")
Es compatible de forma nativa en python, como puede ver aquí:
contestado el 03 de mayo de 12 a las 18:05
2
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 python string substring string-interpolation or haz tu propia pregunta.
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 {} - Tony Veijalainen