Cadenas de texto en Python
En esta lección
- Crear cadenas: comillas simples, dobles y triples
- Caracteres de escape y cadenas raw
- Longitud, concatenar y repetir
- Índices: acceder a cada carácter
- Slicing: sacar trozos
- Las cadenas son inmutables
- Métodos de las cadenas
- Recorrer una cadena y el operador in
- f-strings a fondo
- Ejemplos prácticos
- Errores frecuentes
- 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:
| Escape | Significado |
|---|---|
\n | Salto de línea |
\t | Tabulador |
\" 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 cambianombre. - Concatenar números:
"Edad: " + 20daTypeError. Usaf"Edad: {20}". - Rutas de Windows sin
r:"C:\nuevos"contiene un salto de línea. Usar"C:\nuevos". - Confundir
findeindex:finddevuelve-1;indexlanza error. - Llamar a
joinal revés: es", ".join(lista), nolista.join(", "). - Comparar sin normalizar:
"Sí" == "si"esFalse. Usastrip()ylower().
Resumen
| Tarea | Cómo |
|---|---|
| Texto de varias líneas | """...""" |
| Salto de línea / tabulador | \n, \t |
| Sin escapes | r"C:\ruta" |
| Longitud | len(texto) |
| Carácter / trozo | texto[0], texto[-1], texto[2:5], texto[::-1] |
| Mayúsculas | upper, lower, title, capitalize |
| Limpiar | strip, lstrip, rstrip |
| Partir y unir | split, "sep".join(lista) |
| Buscar | in, find, index, count, startswith, endswith |
| Validar | isdigit, isalpha, isalnum |
| Rellenar | center, ljust, rjust, zfill |
| Construir | f"{valor:.2f}" |
Recuerda: las cadenas son inmutables; cada método devuelve una cadena nueva.
Pon a prueba lo que has aprendido
¿Te ha quedado claro? Márcala y verás tu progreso en el explorador.