Cadenas de texto en Python: métodos, slicing y ejercicios
Actualizado el 29 de septiembre de 2026
Una cadena de texto (string, o str en Python) es una secuencia de caracteres: un nombre, un correo, una línea de un archivo. Buena parte de la programación del día a día es limpiar, cortar, buscar y armar textos, y Python trae métodos para casi todo.
En esta guía vas a ver cómo acceder a partes de un texto, los métodos más útiles y la característica que más confunde al principio: los strings no se pueden modificar.
Índices y slicing
Un string funciona como una lista de caracteres: cada uno tiene un índice que parte en 0, y se puede cortar con la misma notación [inicio:fin] que las listas.
texto = "Programar"
texto[0] # 'P'
texto[-1] # 'r'
texto[0:3] # 'Pro'
texto[::-1] # 'ramargorP' (invertido)
len(texto) # 9Dentro de un string, \n representa un salto de línea. Para escribir un texto de varias líneas también se pueden usar comillas triples: """...""".
Los strings no se modifican: se crean nuevos
Los strings son inmutables. Ningún método cambia el texto original: todos devuelven un string nuevo. Por eso, para quedarte con el resultado, tienes que guardarlo:
t = "hola"
t.upper()
print(t) # hola (no cambió)
t = t.upper()
print(t) # HOLALimpiar y transformar
s = " Hola Mundo "
s.strip() # 'Hola Mundo' (quita espacios al inicio y al final)
s.lower() # ' hola mundo '
s.upper() # ' HOLA MUNDO '
s.strip().replace("Mundo", "Chile") # 'Hola Chile'
"hola mundo".title() # 'Hola Mundo'
"hola mundo".capitalize() # 'Hola mundo'Como cada método devuelve un string, se pueden encadenar: s.strip().lower() limpia y pasa a minúsculas en una línea. strip() es especialmente útil con datos que escribe una persona, que casi siempre traen espacios de más.
Separar y unir: split y join
"uno,dos,tres".split(",") # ['uno', 'dos', 'tres']
" varias palabras aquí ".split() # ['varias', 'palabras', 'aquí']
"-".join(["2026", "09", "29"]) # '2026-09-29'
" ".join(["hola", "mundo"]) # 'hola mundo'split() corta un texto en una lista y join() hace lo contrario. join se escribe al revés de lo que uno esperaría: el separador va primero y la lista entre paréntesis. Sin argumentos, split() separa por cualquier cantidad de espacios y descarta los vacíos.
Buscar dentro de un texto
frase = "el perro y el gato"
"perro" in frase # True
frase.find("el") # 0 (posición de la primera aparición)
frase.find("pez") # -1 (no está)
frase.count("el") # 2
frase.startswith("el") # True
frase.endswith("gato") # True
"123".isdigit() # True
"abc".isalpha() # TruePara comparar sin importar mayúsculas, convierte ambos lados: a.lower() == b.lower().
Errores comunes
Intentar cambiar una letra
texto = "Programar"
texto[0] = "p"
# TypeError: 'str' object does not support item assignmentComo los strings son inmutables, hay que armar uno nuevo: "p" + texto[1:], o usar replace().
Llamar un método sin guardar el resultado
nombre.strip() sola no hace nada visible: devuelve un texto limpio que se pierde. Escribe nombre = nombre.strip(). Es el error más común con strings, justamente porque las listas sí se modifican con métodos como append().
split(" ") con espacios repetidos
"a b".split(" ") # ['a', '', 'b']
"a b".split() # ['a', 'b']Con un separador explícito, dos espacios seguidos generan un elemento vacío. Para separar palabras, usa split() sin argumentos.
find e index no son iguales
Si el texto buscado no está, find() devuelve -1 y index() lanza ValueError: substring not found. Cuidado con find: -1 es un índice válido (el último carácter), así que usarlo sin revisar puede dar resultados raros en vez de un error.
Ejercicios resueltos
Intenta resolver cada ejercicio antes de abrir la solución: equivocarse y corregir es la parte que más enseña.
1.¿Es palíndromo?
Escribe una función es_palindromo(texto) que devuelva True si el texto se lee igual al derecho y al revés, sin considerar espacios ni mayúsculas.
es_palindromo("Anita lava la tina")→Truees_palindromo("reconocer")→Truees_palindromo("python")→False
def es_palindromo(texto):
...Ver soluciónOcultar solución
def es_palindromo(texto):
limpio = texto.replace(" ", "").lower()
return limpio == limpio[::-1]Primero se normaliza el texto: sin espacios y en minúsculas, porque "A" y "a" deben contar como la misma letra. Después basta con compararlo con su versión invertida, limpio[::-1]. Guardar el texto limpio en una variable evita repetir la limpieza dos veces.
2.Iniciales de un nombre
Escribe una función iniciales(nombre_completo) que devuelva la inicial de cada palabra en mayúscula, seguida de un punto.
iniciales("gabriela mistral")→"G.M."iniciales("Pablo Neruda")→"P.N."
def iniciales(nombre_completo):
...Ver soluciónOcultar solución
def iniciales(nombre_completo):
resultado = ""
for palabra in nombre_completo.split():
resultado += palabra[0].upper() + "."
return resultadosplit() sin argumentos separa las palabras aunque haya espacios de más, como en el segundo ejemplo. De cada palabra se toma la primera letra, se pasa a mayúscula y se agrega un punto. El resultado se va armando en un acumulador que parte como texto vacío.
Una versión más compacta, cuando conozcas las comprensiones: "".join(p[0].upper() + "." for p in nombre_completo.split()).
3.Invertir el orden de las palabras
Escribe una función invertir_palabras(frase) que devuelva las mismas palabras en orden inverso, separadas por un solo espacio.
invertir_palabras("hola mundo cruel")→"cruel mundo hola"invertir_palabras(" uno dos ")→"dos uno"
def invertir_palabras(frase):
...Ver soluciónOcultar solución
def invertir_palabras(frase):
return " ".join(frase.split()[::-1])Se combinan tres pasos: split() convierte la frase en una lista de palabras, [::-1] invierte la lista y " ".join() la vuelve a unir con un espacio. Invertir la frase completa con frase[::-1] no sirve: daría "leurc odnum aloh", porque invertiría también las letras.