¿Quien no ha necesitado en alguna ocasión reemplazar más de una subcadena a la vez de una cadena dada mientras programaba alguna aplicación en Python?. Para la gente que ha programado anteriormente en PHP una función que se echa mucho de menos es la función strtr que sirve precisamente para reemplazar substrings de una cadena.
Python nos ofrece un mecanismo para poder emular ese comportamiento y de esa manera poder reemplazar múltiples substrings de una cadena de forma sencilla. El truco consiste en utilizar el módulo estándar re (regular expression) que nos provee de soporte para operar con expresiones regulares similares a aquellas que podemos encontrar en Perl.
Utilizando el módulo re podremos realizar un reemplazo múltiple de cadenas en Python sin mayor problema. Aquí tienes un ejemplo de como llevar a cabo esa tarea utilizando directamente la consola de Python.
>>> # importamos el modulo re
>>> import re
>>> # nuestra cadena
>>> cadena = "El verde es el color de la esperanza"
>>> # el diccionario que contiene las subcadenas a ser reemplazadas
>>> reemplazo = {
... "verde" : "rojo",
... "esperanza" : "sangre"
>>> }
>>> # creamos una expresion regular desde el diciconario
>>> regex = re.compile("(%s)" % "|".join(map(re.escape, reemplazo.keys())))
>>> # si encontramos una coincidencia buscamos su correspondiente reemplazo en el diccionario
>>> nueva_cadena = regex.sub(lambda x: str(reemplazo[x.string[x.start() :x.end()]]), cadena)
>>> # imprimimos la cadena y la nueva cadena con los reemplazos efectuados
>>> print cadena
>>> El verde es el color de la esperanza
>>> print nueva_cadena
>>> El rojo es el color de la sangre
>>>
Como puedes ver es la cosa más sencilla del mundo. Creamos una expresión regular a partir de las llaves del diccionario que contiene las subcadenas a reemplazar utilizando para ello el método compile del objeto re generando la cadena de la expresión a través de un join de las llaves del diccionario. Una vez tenemos nuestra expresión regular procedemos a obtener la cadena reemplazada haciendo uso del método sub del objeto de la expresión regular obtenida en la línea anterior.
¿Y tengo que escribir todo ese código cada vez que necesite hacer un reemplazo múltiple de cadenas en Python? te estarás preguntando. Obviamente lo suyo es que hagas una función que realice esta operación. Puedes crear un módulo donde alojar dicha función y así poder reutilizarla en cualquier aplicación que desarrolles con éste fantástico lenguaje de programación.
def my_strtr(cadena, reemplazo): """Reemplazo múltiple de cadenas en Python.""" import re regex = re.compile("(%s)" % "|".join(map(re.escape, reemplazo.keys()))) return regex.sub(lambda x: str(reemplazo[x.string[x.start() :x.end()]]), cadena)
Guardamos ese snippet de código como mystrtr.py por ejemplo y podremos utilizarlo en nuestros proyectos cuando queramos, veamos como hacerlo desde la consola de Python.
>>> from mystrtr import *
>>> reemplazo = { 'verde' : 'rojo', 'esperanza' : 'sangre' }
>>> print my_strtr('El verde es el color de la esperanza', reemplazo)
El rojo es el color de la sangre
>>>
Eso está mucho mejor estás pensando, pero... ¿por qué no ir un poco más allá?. Podemos crear nuestra propia versión de objeto string y añadirle esa funcionalidad directamente.
class MyStr(str): def strtr(self, reemplazo): """Reemplazo múltiple de cadenas en Python.""" import re regex = re.compile("(%s)" % "|".join(map(re.escape, reemplazo.keys()))) return regex.sub(lambda x: str(reemplazo[x.string[x.start() :x.end()]]), self)
Guardamos el archivo y podemos probarlo directamente desde la consola de Python.
>>> from mystr import *
>>> cadena = "El verde es el color de la esperanza"
>>> cadena = MyStr(cadena)
>>> print cadena.strtr({'verde' : 'rojo', 'esperanza' : 'sangre'})
>>>
>>> # tambien podemos usar el objeto MyStr diretamente sin convertir desde str
>>> cadena = MyStr("Un elefante se balanceaba sobre la tela de una araña")
>>> print cadena.strtr({'elefante' : 'ornitorrinco', 'balanceaba' : 'acicalaba'})
Un ornitorrinco se acicalaba sobre la tela de una araña
>>>
Hasta donde yo se, Python no permite sobreescribir sus tipos built in, en ese aspecto es bastante estricto, me imagino como sería poder sobreescribir directamente al objeto str y añadirle éste método. Espero que os haya sido de utilidad.
En Genbeta Dev | Aprende a programar en Python con Google y sus clases virtuales