Saltar a contenido

3.0 Cadenas de texto

Una cadena es una secuencia de caracteres: un nombre, una frase, el contenido de un archivo. Casi todo programa las maneja, y casi siempre se hace lo mismo: recorrerlas, buscar dentro, partirlas y transformarlas.

En Python el texto es un str. Las cadenas son inmutables: ningún método modifica la original, todos devuelven una nueva.

Recorrer y buscar

texto = "banana"
print(f"longitud: {len(texto)}")
print(f"primera: {texto[0]}, última: {texto[-1]}")
print(f"subcadena: {texto[2:5]}")

cuenta = 0
for letra in texto:
    if letra == "a":
        cuenta += 1
print(f"letras a: {cuenta}")
print(f'posición de "na": {texto.find("na")}')
print(f'contiene "nan": {"sí" if "nan" in texto else "no"}')

al_reves = ""
j = len(texto) - 1
while j >= 0:
    al_reves += texto[j]
    j -= 1
print(f"al revés: {al_reves}")

Salida:

longitud: 6
primera: b, última: a
subcadena: nan
letras a: 3
posición de "na": 2
contiene "nan": sí
al revés: ananab

Los índices empiezan en 0 y el último es len(texto) - 1; además, los negativos cuentan desde el final (texto[-1] es la última letra). Acceder fuera de rango lanza IndexError; en cambio, una porción (texto[2:50]) nunca falla: se recorta sola.

Fíjate en el patrón de recorrido: una variable que va de la primera posición a la última (o al revés) y, dentro, una pregunta sobre la letra actual. Con él se cuenta, se busca y se invierte; es la base de los ejercicios de este apartado. Las cadenas ya traen métodos que lo hacen por ti (indexOf/find, contains...), pero conviene saber hacerlo a mano.

El final de una subcadena no se incluye

substring(2, 5) (o texto[2:5]) toma las posiciones 2, 3 y 4. Calcula el tamaño restando: 5 - 2 = 3 letras.

Transformar

original = "  Hola, Mundo DAM  "
limpio = original.strip()
print(f"recortado: [{limpio}]")
print(f"mayúsculas: {limpio.upper()}")
print(f"minúsculas: {limpio.lower()}")
print(f"reemplazado: {limpio.replace('Mundo', 'Clase')}")

partes = limpio.split(", ")
print(f"partes: {len(partes)} -> {partes[0]} | {partes[1]}")
print(f"unido: {'-'.join(partes)}")
print(f'empieza por "Hola": {"sí" if limpio.startswith("Hola") else "no"}')
print(f"con ceros: {7:03d}")
print(f"original sigue igual: [{original}]")

Salida:

recortado: [Hola, Mundo DAM]
mayúsculas: HOLA, MUNDO DAM
minúsculas: hola, mundo dam
reemplazado: Hola, Clase DAM
partes: 2 -> Hola | Mundo DAM
unido: Hola-Mundo DAM
empieza por "Hola": sí
con ceros: 007
original sigue igual: [  Hola, Mundo DAM  ]

Observa la última línea: tras todos los cambios, original no ha variado, porque cada método devuelve una cadena nueva. Si quieres quedarte con el resultado, guárdalo en una variable (limpio = original.strip()), no basta con llamar al método.

Los métodos más útiles

Operación En Python
Longitud len(texto)
Un carácter texto[i] · texto[-1] (el último)
Subcadena (el final no se incluye) texto[2:5]
Buscar posición (-1 si no está) texto.find("na")
¿Contiene? ¿Empieza? ¿Acaba? "nan" in texto · startswith("ba") · endswith("na")
Reemplazar replace("a", "o")
Trocear / unir texto.split(", ") · "-".join(partes)
Quitar espacios de los extremos strip()
Mayúsculas / minúsculas upper() · lower()
Rellenar con ceros f"{7:03d}" · "7".zfill(3)
Repetir "ab" * 3

Para darle la vuelta rápidamente: texto[::-1]. Para construir un texto grande con muchos trozos, mete los trozos en una lista y únelos al final con "".join(lista), que es más rápido que += repetido.

Unicode

len cuenta caracteres Unicode (un emoji cuenta 1), pero algunos símbolos compuestos (una letra con acento escrita en dos partes, una bandera) siguen siendo varios caracteres.

Errores frecuentes

Error Cómo evitarlo
Llamar a un método y esperar que cambie la cadena Recoge el valor devuelto en una variable
Pasarse un puesto al recorrer (<= en lugar de <) El último índice es la longitud menos 1
Olvidar que el final de una subcadena no se incluye Cuenta las letras: final - inicio
Comparar mayúsculas con minúsculas Pasa los dos textos a minúsculas antes de comparar

Para practicar

Haz los ejercicios 3.0 de cadenas. Para ver cómo se escribe lo mismo en otro lenguaje: Pasar de uno a otro.