Reemplazar ocurrencias de una subcadena en una cadena con Python

En este tutorial, mostraremos cómo reemplazar todas o *n* ocurrencias de una subcadena de una cadena en python usando replace(), sub() y subn() con ejemplos y expresiones regulares.

Introducción

Reemplazar todas o n las ocurrencias de una subcadena en una cadena dada es un problema bastante común de manipulación de cadenas y procesamiento de texto en general. Afortunadamente, la mayoría de estas tareas se facilitan en Python gracias a su amplia gama de funciones integradas, incluida esta.

Digamos que tenemos una cadena que contiene la siguiente oración:

1
The brown-eyed man drives a brown car.

Nuestro objetivo es reemplazar la palabra "marrón" con la palabra "azul":

1
The blue-eyed man drives a blue car.

En este artículo, usaremos la función replace() así como las funciones sub() y subn() con patrones para reemplazar todas las apariciones de una subcadena de una cadena.

reemplazar()

La forma más sencilla de hacer esto es usando la función integrada - replace() :

1
string.replace(oldStr, newStr, count)

Los dos primeros parámetros son obligatorios, mientras que el tercero es opcional. oldStr es la subcadena que queremos reemplazar con newStr. Lo que vale la pena señalar es que la función devuelve una nueva cadena, con la transformación realizada, sin afectar la original.

Hagamos un intento:

1
2
3
4
string_a = "The brown-eyed man drives a brown car."
string_b = string_a.replace("brown", "blue")
print(string_a)
print(string_b)

Realizamos la operación en string_a, empaquetamos el resultado en string_b e imprimimos ambos.

Este código da como resultado:

1
2
The brown-eyed man drives a brown car.
The blue-eyed man drives a blue car.

Nuevamente, la cadena en la memoria a la que apunta string_a permanece sin cambios. Las cadenas en Python son inmutables, lo que simplemente significa que no puede cambiar una cadena. Sin embargo, puede reasignar la variable de referencia a un nuevo valor.

Para realizar aparentemente esta operación en el lugar, simplemente podemos reasignar string_a a sí mismo después de la operación:

1
2
string_a = string_a.replace("brown", "blue")
print(string_a)

Aquí, la nueva cadena generada por el método replace() se asigna a la variable string_a.

Reemplazar n Ocurrencias de una subcadena

Ahora, ¿qué sucede si no deseamos cambiar todas las ocurrencias de una subcadena? ¿Qué pasa si queremos reemplazar el primer n?

Ahí es donde entra el tercer parámetro de la función replace(). Representa el número de subcadenas que se van a reemplazar. El siguiente código solo reemplaza la primera aparición de la palabra "marrón" con la palabra "azul":

1
2
3
string_a = "The brown-eyed man drives a brown car."
string_a = string_a.replace("brown", "blue", 1)
print(string_a)

Y esto imprime:

1
The blue-eyed man drives a brown car.

De forma predeterminada, el tercer parámetro está configurado para cambiar todas las ocurrencias.

Ocurrencias de subcadena con expresiones regulares

Para escalar el problema aún más, digamos que queremos no solo reemplazar todas las apariciones de una determinada subcadena, sino también reemplazar todas las subcadenas que se ajusten a un determinado patrón. Incluso esto se puede hacer con una sola línea, usando expresiones regulares y el módulo re de la biblioteca estándar.

Las expresiones regulares son un tema complejo con una amplia gama de usos en informática, por lo que no profundizaremos mucho en este artículo, pero si necesita un comienzo rápido, puede consultar nuestra guía sobre Expresiones regulares en Python .

En esencia, una expresión regular define un patrón. Por ejemplo, digamos que tenemos un texto sobre personas que tienen perros y gatos, y queremos cambiar ambos términos con la palabra "mascota". Primero, necesitamos definir un patrón que coincida con ambos términos como - (gato|perro).

Usando la función sub()

Con el patrón resuelto, vamos a usar la función re.sub() que tiene la siguiente sintaxis:

1
re.sub(pattern, repl, string, count, flags)

El primer argumento es el patrón que estamos buscando (una cadena o un objeto Pattern), repl es lo que vamos a insertar (puede ser una cadena o una función; si es una cadena, cualquier escape de barra invertida en él se procesa) y string es la cadena en la que estamos buscando.

Los argumentos opcionales son count y flags, que indican cuántas apariciones deben reemplazarse y qué banderas se utilizan para procesar la expresión regular, respectivamente.

Si el patrón no coincide con ninguna subcadena, la cadena original se devolverá sin cambios:

1
2
3
import re
string_a = re.sub(r'(cat|dog)', 'pet', "Mark owns a dog and Mary owns a cat.")
print(string_a)

Este código imprime:

1
Mark owns a pet and Mary owns a pet.

Coincidencia de patrones que no distingue entre mayúsculas y minúsculas

Para realizar coincidencias de patrones que no distinguen entre mayúsculas y minúsculas, por ejemplo, estableceremos el parámetro de bandera en re.IGNORECASE:

1
2
3
import re
string_a = re.sub(r'(cats|dogs)', "Pets", "DoGs are a man's best friend", flags=re.IGNORECASE)
print(string_a)

Ahora también se incluirá cualquier combinación de casos de "dogs". Al hacer coincidir el patrón con varias cadenas, para evitar copiarlo en varios lugares, podemos definir un objeto Patrón. También tienen una función sub() con la sintaxis:

1
Pattern.sub(repl, string, count)

Uso de objetos Pattern

Definamos un Patrón para gatos y perros y revisemos un par de oraciones:

1
2
3
4
5
6
import re
pattern = re.compile(r'(Cats|Dogs)')
string_a = pattern.sub("Pets", "Dogs are a man's best friend.")
string_b = pattern.sub("Animals", "Cats enjoy sleeping.")
print(string_a)
print(string_b)

Lo que nos da la salida:

1
2
Pets are a man's best friend.
Animals enjoy sleeping.

La función subn()

También hay un método subn() con la sintaxis:

1
re.subn(pattern, repl, string, count, flags)

La función subn() devuelve una tupla con la cadena y el número de coincidencias en la cadena que hemos buscado:

1
2
3
import re
string_a = re.subn(r'(cats|dogs)', 'Pets', "DoGs are a mans best friend", flags=re.IGNORECASE)
print(string_a)

La tupla se parece a:

1
('Pets are a mans best friend', 1)

Un objeto Pattern contiene una función subn() similar:

1
Pattern.subn(repl, string, count)

Y se usa de una manera muy similar:

1
2
3
4
5
6
import re
pattern = re.compile(r'(Cats|Dogs)')
string_a = pattern.subn("Pets", "Dogs are a man's best friend.")
string_b = pattern.subn("Animals", "Cats enjoy sleeping.")
print(string_a)
print(string_b)

Esto resulta en:

1
2
("Pets are a man's best friend.", 1)
('Animals enjoy sleeping.', 1)

Conclusión

Python ofrece funciones fáciles y simples para el manejo de cadenas. La forma más fácil de reemplazar todas las apariciones de una subcadena dada en una cadena es usar la función reemplazar().

Si es necesario, el módulo re de la biblioteca estándar proporciona un conjunto de herramientas más diverso que se puede usar para más problemas de nicho, como encontrar patrones y búsquedas que no distinguen entre mayúsculas y minúsculas.

Licensed under CC BY-NC-SA 4.0