Ir al contenido principal

Manipulación de cadenas: búsqueda, reemplazo y formato

Introducción

Las cadenas de texto son uno de los tipos de datos más utilizados en programación, y Python ofrece un conjunto muy completo de métodos para manipularlas de forma eficiente. En este artículo, exploraremos las principales operaciones que podemos realizar con cadenas: buscar subcadenas, reemplazar contenido y dar formato al texto. Estas habilidades son fundamentales para el procesamiento de texto, la validación de datos y la generación de salidas legibles. Dominar estos métodos te permitirá manipular texto de manera efectiva, una tarea común en casi cualquier programa.

Métodos para la manipulación de cadenas

Métodos de búsqueda

Python proporciona varios métodos para buscar subcadenas dentro de una cadena principal:

El método find()

El método find() busca una subcadena y devuelve el índice de la primera aparición. Si no encuentra la subcadena, devuelve -1.

texto = "Python es un lenguaje de programación versátil"

# Buscar una subcadena
posicion = texto.find("lenguaje")
print(posicion)  # 11

# Si no se encuentra, devuelve -1
posicion = texto.find("Java")
print(posicion)  # -1

# Búsqueda con posición de inicio
posicion = texto.find("o", 5)  # Busca "o" a partir del índice 5
print(posicion)  # 18

# Búsqueda con posición de inicio y fin
posicion = texto.find("o", 0, 10)  # Busca "o" entre los índices 0 y 10
print(posicion)  # 4

El método rfind()

Similar a find(), pero busca desde el final de la cadena hacia el principio (devuelve el índice de la última aparición).

texto = "Python es un lenguaje de programación en Python"

posicion = texto.rfind("Python")
print(posicion)  # 36

Los métodos index() y rindex()

Funcionan igual que find() y rfind(), pero lanzan una excepción ValueError si no encuentran la subcadena en lugar de devolver -1.

texto = "Python es un lenguaje de programación versátil"

try:
    posicion = texto.index("lenguaje")
    print(posicion)  # 11
    
    posicion = texto.index("Java")  # Esto causará un error
except ValueError:
    print("Subcadena no encontrada")  # Subcadena no encontrada

Los métodos startswith() y endswith()

Verifican si una cadena comienza o termina con una subcadena específica.

texto = "Python es genial"

# Verificar inicio
print(texto.startswith("Python"))  # True
print(texto.startswith("python"))  # False (distingue mayúsculas y minúsculas)
print(texto.startswith("es", 7))   # True (comenzando desde el índice 7)

# Verificar final
print(texto.endswith("genial"))  # True
print(texto.endswith("Genial"))  # False
print(texto.endswith("es", 0, 9))  # True (en el rango de índices 0 a 9)

El método count()

Cuenta cuántas veces aparece una subcadena.

texto = "Python es un lenguaje muy potente y muy flexible"

ocurrencias = texto.count("muy")
print(ocurrencias)  # 2

# Contar en un rango
ocurrencias = texto.count("muy", 0, 25)
print(ocurrencias)  # 1

El método in

Aunque no es un método sino un operador, in es muy útil para verificar si una subcadena existe en una cadena.

texto = "Python es un lenguaje de programación"

print("Python" in texto)  # True
print("Java" in texto)    # False

Métodos de reemplazo

Los métodos de reemplazo nos permiten modificar el contenido de las cadenas:

El método replace()

Reemplaza todas las apariciones de una subcadena por otra.

texto = "Python es genial, Python es potente"

# Reemplazar todas las apariciones
nuevo_texto = texto.replace("Python", "JavaScript")
print(nuevo_texto)  # "JavaScript es genial, JavaScript es potente"

# Limitar el número de reemplazos
nuevo_texto = texto.replace("Python", "JavaScript", 1)
print(nuevo_texto)  # "JavaScript es genial, Python es potente"

El método strip()

Elimina espacios en blanco (o caracteres especificados) al principio y al final de una cadena.

texto = "   Python es genial   "

# Eliminar espacios al principio y al final
limpio = texto.strip()
print(f"'{limpio}'")  # 'Python es genial'

# Eliminar caracteres específicos
texto = "...Python es genial..."
limpio = texto.strip(".")
print(limpio)  # 'Python es genial'

Los métodos lstrip() y rstrip()

Similares a strip(), pero eliminan caracteres solo al principio (lstrip()) o al final (rstrip()).

texto = "   Python es genial   "

# Eliminar espacios solo al principio
limpio = texto.lstrip()
print(f"'{limpio}'")  # 'Python es genial   '

# Eliminar espacios solo al final
limpio = texto.rstrip()
print(f"'{limpio}'")  # '   Python es genial'

El método translate()

Permite hacer múltiples reemplazos de caracteres a la vez mediante una tabla de traducción.

# Crear una tabla de traducción con str.maketrans()
tabla = str.maketrans({
    "a": "4",
    "e": "3",
    "i": "1",
    "o": "0"
})

texto = "Python es divertido"
resultado = texto.translate(tabla)
print(resultado)  # "Pyth0n 3s d1v3rt1d0"

Métodos de formato y caso

Python ofrece varios métodos para cambiar el formato y el caso de las cadenas:

Los métodos upper(), lower() y title()

Cambian el caso de los caracteres.

texto = "Python es genial"

# Convertir a mayúsculas
print(texto.upper())  # "PYTHON ES GENIAL"

# Convertir a minúsculas
print(texto.lower())  # "python es genial"

# Convertir la primera letra de cada palabra a mayúscula
print(texto.title())  # "Python Es Genial"

El método capitalize()

Convierte a mayúscula solo la primera letra de la cadena.

texto = "python es genial"
print(texto.capitalize())  # "Python es genial"

El método swapcase()

Invierte mayúsculas y minúsculas.

texto = "Python Es Genial"
print(texto.swapcase())  # "pYTHON eS gENIAL"

El método center()

Centra el texto en un campo de ancho especificado.

texto = "Python"
centrado = texto.center(20, "-")
print(centrado)  # "-------Python-------"

Los métodos ljust() y rjust()

Alinean el texto a la izquierda o derecha en un campo de ancho especificado.

texto = "Python"

alineado_izq = texto.ljust(15, "*")
print(alineado_izq)  # "Python*********"

alineado_der = texto.rjust(15, "*")
print(alineado_der)  # "*********Python"

El método zfill()

Rellena una cadena con ceros a la izquierda hasta alcanzar un ancho especificado.

numero = "42"
rellenado = numero.zfill(5)
print(rellenado)  # "00042"

Métodos de división

Estos métodos nos permiten separar cadenas en partes:

El método split()

Divide una cadena en una lista de subcadenas según un separador.

texto = "Python es un lenguaje de programación"

# División por espacios (por defecto)
palabras = texto.split()
print(palabras)  # ['Python', 'es', 'un', 'lenguaje', 'de', 'programación']

# División por otro carácter
texto = "rojo,verde,azul,amarillo"
colores = texto.split(",")
print(colores)  # ['rojo', 'verde', 'azul', 'amarillo']

# Limitar el número de divisiones
texto = "Python,Java,C++,JavaScript,Ruby"
lenguajes = texto.split(",", 2)
print(lenguajes)  # ['Python', 'Java', 'C++,JavaScript,Ruby']

El método rsplit()

Similar a split(), pero divide desde el final de la cadena.

texto = "Python,Java,C++,JavaScript,Ruby"
lenguajes = texto.rsplit(",", 2)
print(lenguajes)  # ['Python,Java,C++', 'JavaScript', 'Ruby']

El método splitlines()

Divide una cadena en líneas.

texto = "Línea 1\nLínea 2\nLínea 3"
lineas = texto.splitlines()
print(lineas)  # ['Línea 1', 'Línea 2', 'Línea 3']

# Conservar los separadores de línea
lineas = texto.splitlines(True)
print(lineas)  # ['Línea 1\n', 'Línea 2\n', 'Línea 3']

El método partition()

Divide una cadena en tres partes: antes, separador y después de la primera aparición del separador.

texto = "Python es un lenguaje de programación"
partes = texto.partition("un")
print(partes)  # ('Python es ', 'un', ' lenguaje de programación')

# Si no se encuentra el separador
partes = texto.partition("Java")
print(partes)  # ('Python es un lenguaje de programación', '', '')

El método rpartition()

Similar a partition(), pero busca la última aparición del separador.

texto = "Python es un lenguaje y Python es potente"
partes = texto.rpartition("Python")
print(partes)  # ('Python es un lenguaje y ', 'Python', ' es potente')

Métodos de verificación

Estos métodos comprueban ciertas propiedades de las cadenas:

# Verificar si todos los caracteres son alfabéticos
print("Python".isalpha())  # True
print("Python3".isalpha())  # False

# Verificar si todos los caracteres son alfanuméricos
print("Python3".isalnum())  # True
print("Python 3".isalnum())  # False

# Verificar si todos los caracteres son dígitos
print("12345".isdigit())  # True
print("123.45".isdigit())  # False

# Verificar si todos los caracteres son espacios en blanco
print("   \t\n".isspace())  # True
print("   a   ".isspace())  # False

# Verificar si la cadena está en minúsculas
print("python".islower())  # True
print("Python".islower())  # False

# Verificar si la cadena está en mayúsculas
print("PYTHON".isupper())  # True
print("Python".isupper())  # False

# Verificar si cada palabra comienza con mayúscula
print("Python Es Genial".istitle())  # True
print("Python es Genial".istitle())  # False

El método join()

Un método muy útil para unir elementos de una lista en una sola cadena:

palabras = ["Python", "es", "genial"]

# Unir con espacio
texto = " ".join(palabras)
print(texto)  # "Python es genial"

# Unir con otro separador
texto = "-".join(palabras)
print(texto)  # "Python-es-genial"

# Unir sin separador
texto = "".join(palabras)
print(texto)  # "Pythonesgenia"

Casos prácticos

Veamos algunos ejemplos prácticos combinando varios métodos:

Ejemplo 1: Limpieza de datos de usuario

entrada = "   python@EJEMPLO.com   "

# Limpiar y normalizar email
email = entrada.strip().lower()
print(email)  # "python@ejemplo.com"

Ejemplo 2: Formateo de un nombre

nombre = "juan garcía lópez"

# Formatear nombre correctamente
nombre_formateado = nombre.title()
print(nombre_formateado)  # "Juan García López"

Ejemplo 3: Extracción de dominio de email

email = "usuario@dominio.com"

# Extraer el dominio
nombre, dominio = email.split("@")
print(f"Nombre de usuario: {nombre}")  # "Nombre de usuario: usuario"
print(f"Dominio: {dominio}")  # "Dominio: dominio.com"

Ejemplo 4: Censura de palabras

texto = "Esta es una frase con palabras que queremos censurar"

# Censurar palabras
censurado = texto.replace("palabras", "****")
print(censurado)  # "Esta es una frase con **** que queremos censurar"

Resumen

Los métodos de cadenas en Python nos proporcionan herramientas potentes para manipular texto de manera eficiente. Hemos explorado métodos para buscar subcadenas como find() e index(), métodos para reemplazar contenido como replace() y strip(), y métodos para dar formato al texto como upper() y center(). También hemos visto cómo dividir cadenas con split() y unirlas con join(). Estos métodos son fundamentales en el procesamiento de texto y se utilizan en multitud de aplicaciones reales. En el próximo artículo, aprenderemos sobre el formateo avanzado de cadenas con f-strings y el método format().