Saltar al contenido
cadenas.py · devschool

Cadenas de texto en Python

Lección 4 de 19 · 9 min de lectura · Actualizado el

En esta lección
  1. Crear cadenas: comillas simples, dobles y triples
  2. Caracteres de escape y cadenas raw
  3. Longitud, concatenar y repetir
  4. Índices: acceder a cada carácter
  5. Slicing: sacar trozos
  6. Las cadenas son inmutables
  7. Métodos de las cadenas
  8. Recorrer una cadena y el operador in
  9. f-strings a fondo
  10. Ejemplos prácticos
  11. Errores frecuentes
  12. Resumen

Casi todos los programas trabajan con texto: nombres de usuario, correos, mensajes, líneas de un fichero. En Python el texto es el tipo str (de string, cadena). En esta lección aprenderás a escribir cadenas, a sacar trozos de ellas, a transformarlas con sus métodos y a construir textos con f-strings. Al final resolverás tres ejercicios típicos: limpiar la entrada del usuario, contar vocales y detectar palíndromos.

Crear cadenas: comillas simples, dobles y triples

Una cadena se escribe entre comillas simples o dobles. Son equivalentes:

nombre = "Lucía"
ciudad = 'Valencia'

Tener las dos sirve para meter comillas dentro sin complicaciones:

frase = "Me dijo 'hola' al entrar"
titulo = 'El libro "Rayuela"'
print(frase)
print(titulo)
# Me dijo 'hola' al entrar
# El libro "Rayuela"

Con triples comillas (""" o ''') puedes escribir texto de varias líneas tal cual:

aviso = """Estimado cliente:
Su pedido ha salido del almacén.
Gracias por su compra."""
print(aviso)
# Estimado cliente:
# Su pedido ha salido del almacén.
# Gracias por su compra.

Caracteres de escape y cadenas raw

La barra invertida \ introduce secuencias de escape, caracteres especiales:

EscapeSignificado
\nSalto de línea
\tTabulador
\" y \'Comillas dentro de una cadena con las mismas comillas
\\Una barra invertida literal
print("Nombre:\tAna\nEdad:\t21")
print("Ella dijo: \"vale\"")
# Nombre:	Ana
# Edad:	21
# Ella dijo: "vale"

Esto da problemas con las rutas de Windows: en "C:\nuevos\tareas", Python ve un \n y un \t. La solución es una cadena raw (cruda), con una r delante, en la que las barras no se interpretan:

ruta = r"C:\nuevos\tareas"
print(ruta)
# C:\nuevos\tareas

Longitud, concatenar y repetir

nombre = "Lucía"
apellido = "Martín"

print(len(nombre))                 # 5: número de caracteres
print(nombre + " " + apellido)     # Lucía Martín
print("-" * 20)                    # --------------------
print("ja" * 3)                    # jajaja

+ solo une textos con textos. Para meter números usa str() o, mejor, una f-string.

Índices: acceder a cada carácter

Cada carácter tiene una posición (índice) que empieza en 0. Los índices negativos cuentan desde el final:

 P   y   t   h   o   n
 0   1   2   3   4   5
-6  -5  -4  -3  -2  -1
lenguaje = "Python"
print(lenguaje[0])    # P
print(lenguaje[3])    # h
print(lenguaje[-1])   # n (el último)
print(lenguaje[-2])   # o

Si pides una posición que no existe (lenguaje[10]), obtienes IndexError: string index out of range.

Slicing: sacar trozos

Con [inicio:fin] obtienes un trozo, desde inicio hasta fin sin incluirlo. Puedes añadir un tercer valor, el paso:

lenguaje = "Python"
print(lenguaje[0:2])    # Py
print(lenguaje[2:])     # thon (hasta el final)
print(lenguaje[:4])     # Pyth (desde el principio)
print(lenguaje[-3:])    # hon  (los tres últimos)
print(lenguaje[::2])    # Pto  (uno sí, uno no)
print(lenguaje[::-1])   # nohtyP (al revés)

A diferencia de los índices, el slicing no da error si te pasas de largo: "Python"[2:100] devuelve "thon".

Un ejemplo práctico: ocultar un número de tarjeta salvo los cuatro últimos dígitos.

tarjeta = "4539123456781234"
print("*" * 12 + tarjeta[-4:])
# ************1234

Las cadenas son inmutables

Una vez creada, una cadena no se puede modificar. Intentar cambiar un carácter da error:

palabra = "gato"
palabra[0] = "p"
# TypeError: 'str' object does not support item assignment

Lo que sí puedes hacer es crear una cadena nueva y guardarla en la misma variable:

palabra = "gato"
palabra = "p" + palabra[1:]
print(palabra)
# pato

Por eso todos los métodos que verás a continuación devuelven una cadena nueva y dejan la original intacta. Si no guardas el resultado, se pierde:

nombre = "ana"
nombre.upper()          # crea "ANA", pero no se guarda
print(nombre)           # ana
nombre = nombre.upper()
print(nombre)           # ANA

Métodos de las cadenas

Un método es una función que pertenece a un valor y se llama con un punto: texto.upper().

Mayúsculas y minúsculas

texto = "aprender PYTHON es fácil"
print(texto.upper())        # APRENDER PYTHON ES FÁCIL
print(texto.lower())        # aprender python es fácil
print(texto.title())        # Aprender Python Es Fácil
print(texto.capitalize())   # Aprender python es fácil

lower() es clave para comparar sin que importen las mayúsculas: respuesta.lower() == "si".

Quitar espacios: strip

entrada = "   ana@correo.es  \n"
print(entrada.strip())             # ana@correo.es
print(entrada.lstrip())            # quita solo por la izquierda
print("--hola--".strip("-"))       # hola (quita los caracteres indicados)

Dividir y unir: split y join

split parte una cadena y devuelve una lista. join hace lo contrario: une una lista de cadenas usando un separador.

frase = "aprender a programar"
palabras = frase.split()          # sin argumento: separa por espacios
print(palabras)                   # ['aprender', 'a', 'programar']

csv = "Ana;21;Madrid"
print(csv.split(";"))             # ['Ana', '21', 'Madrid']

print("-".join(palabras))         # aprender-a-programar
print(", ".join(["pan", "leche", "huevos"]))   # pan, leche, huevos

Fíjate en que join se llama sobre el separador, no sobre la lista.

Reemplazar: replace

mensaje = "Hola, Luis. ¿Qué tal, Luis?"
print(mensaje.replace("Luis", "Eva"))       # Hola, Eva. ¿Qué tal, Eva?
print(mensaje.replace("Luis", "Eva", 1))    # solo la primera vez
print("1.250,50".replace(".", "").replace(",", "."))   # 1250.50

Buscar: find, index, count, startswith, endswith

email = "marta.lopez@instituto.es"
print(email.find("@"))           # 11: posición de la primera aparición
print(email.find("#"))           # -1: no está
print(email.count("."))          # 2
print(email.startswith("marta")) # True
print(email.endswith(".es"))     # True

index funciona como find, pero si no encuentra el texto lanza ValueError en lugar de devolver -1. Usa find cuando no estés seguro de que el texto está.

Combinando find y slicing puedes extraer el dominio de un correo:

email = "marta.lopez@instituto.es"
arroba = email.find("@")
print(email[arroba + 1:])
# instituto.es

Comprobar el contenido: isdigit, isalpha, isalnum

Devuelven True o False según el tipo de caracteres. Son muy útiles para validar lo que escribe el usuario antes de convertirlo:

print("2024".isdigit())      # True: solo dígitos
print("-5".isdigit())        # False: el signo no es un dígito
print("Lucía".isalpha())     # True: solo letras
print("Lucía 2".isalpha())   # False: tiene un espacio y un número
print("user42".isalnum())    # True: letras y números
print("".isdigit())          # False: vacía

Alinear y rellenar: center, ljust, rjust, zfill

print("MENÚ".center(20, "="))    # ========MENÚ========
print("Pan".ljust(10, ".") + "1.20")    # Pan.......1.20
print("42".rjust(6))             # "    42"
print("7".zfill(3))              # 007

zfill es perfecto para códigos y números de factura: str(numero).zfill(5).

Recorrer una cadena y el operador in

Una cadena es una secuencia de caracteres, así que puedes recorrerla con un bucle for:

for letra in "sol":
    print(letra)
# s
# o
# l

Y in comprueba si un texto está dentro de otro:

print("thon" in "Python")       # True
print("@" not in "anacorreo")   # True

f-strings a fondo

Las f-strings (una f delante de las comillas) son la forma recomendada de construir textos. Entre llaves puedes poner variables, operaciones o llamadas a métodos:

producto = "auriculares"
precio = 34.9
unidades = 3
print(f"{unidades} x {producto.upper()} = {precio * unidades:.2f} €")
# 3 x AURICULARES = 104.70 €

Tras : va el formato: .2f para decimales, , para miles, >10, <10 y ^10 para alinear, 03d para rellenar con ceros. Tienes la tabla completa en Variables y tipos.

Dos trucos más:

nota = 7.456
print(f"{nota=}")            # nota=7.456 (muestra el nombre y el valor; útil para depurar)
print(f"{{llaves}} {nota}")  # {llaves} 7.456 (dobla las llaves para escribirlas)

Cuidado: hasta Python 3.11 no puedes reutilizar dentro de las llaves el mismo tipo de comillas que abren la f-string: f"{alumno["nombre"]}" da error. Usa las otras: f"{alumno['nombre']}". Python 3.12 ya lo admite, pero la versión con comillas alternas funciona en todas.

Ejemplos prácticos

Limpiar la entrada del usuario

La gente escribe con espacios de más y mayúsculas al azar. Normaliza antes de comparar:

respuesta = input("¿Quieres continuar? (s/n) ")   # el usuario escribe "  SI "
respuesta = respuesta.strip().lower()
if respuesta in ("s", "si", "sí"):
    print("Seguimos")
# Seguimos

Los métodos se pueden encadenar porque cada uno devuelve una cadena nueva.

Contar vocales

def contar_vocales(texto):
    total = 0
    for letra in texto.lower():
        if letra in "aeiouáéíóú":
            total += 1
    return total

print(contar_vocales("Murciélago"))
# 5

Detectar un palíndromo

Un palíndromo se lee igual al derecho y al revés. Primero quitamos espacios y pasamos a minúsculas; después comparamos con la cadena invertida:

def es_palindromo(frase):
    limpia = frase.lower().replace(" ", "")
    return limpia == limpia[::-1]

print(es_palindromo("Anita lava la tina"))   # True
print(es_palindromo("Python"))               # False

Errores frecuentes

  • Olvidar que los métodos no modifican la cadena: nombre.strip() sin asignar no cambia nombre.
  • Concatenar números: "Edad: " + 20 da TypeError. Usa f"Edad: {20}".
  • Rutas de Windows sin r: "C:\nuevos" contiene un salto de línea. Usa r"C:\nuevos".
  • Confundir find e index: find devuelve -1; index lanza error.
  • Llamar a join al revés: es ", ".join(lista), no lista.join(", ").
  • Comparar sin normalizar: "Sí" == "si" es False. Usa strip() y lower().

Resumen

TareaCómo
Texto de varias líneas"""..."""
Salto de línea / tabulador\n, \t
Sin escapesr"C:\ruta"
Longitudlen(texto)
Carácter / trozotexto[0], texto[-1], texto[2:5], texto[::-1]
Mayúsculasupper, lower, title, capitalize
Limpiarstrip, lstrip, rstrip
Partir y unirsplit, "sep".join(lista)
Buscarin, find, index, count, startswith, endswith
Validarisdigit, isalpha, isalnum
Rellenarcenter, ljust, rjust, zfill
Construirf"{valor:.2f}"

Recuerda: las cadenas son inmutables; cada método devuelve una cadena nueva.

Pon a prueba lo que has aprendido

[Python] ¿Qué muestra este código?
palabra = "Python"
print(palabra[1:4])

[Python] ¿Qué muestra este código?
nombre = "  ana "
nombre.strip()
print(len(nombre))

[Python] ¿Qué muestra este código?
print("2024".isdigit(), "-5".isdigit())

[Python] ¿Qué muestra este código?
print("banana".find("n"), "banana".count("a"))

¿Te ha quedado claro? Márcala y verás tu progreso en el explorador.