Saltar al contenido
Numerus Scriptum por Edison Achalma

Rebanado de cadenas

A menudo necesitas trabajar con partes de un texto: extraer el nombre de usuario de un email, obtener la extensión de un archivo, o simplemente tomar una porción de un mensaje.

7 min de lectura PDF de esta lección(56 KB) DOCX (29 KB)

0.1 Motivación

A menudo necesitas trabajar con partes de un texto: extraer el nombre de usuario de un email, obtener la extensión de un archivo, o simplemente tomar una porción de un mensaje. El slicing (rebanado) te permite hacer esto de manera elegante y eficiente, sin necesidad de bucles o lógica compleja.

0.2 Intuición

Imagina que tienes una fila de personas (string) y quieres seleccionar a las personas de las posiciones 2 a 5. El slicing es como decir: “dame desde la posición 2 hasta la posición 5”. En Python, [2:5] significa: empieza en el índice 2 y detente antes del índice 5. Es como un cuchillo que corta exactamente donde le indicas.

0.3 Modelo mental

La sintaxis de slicing es [inicio:fin:paso]:

  • inicio (opcional): dónde empezar (incluido). Por defecto es el principio.
  • fin (opcional): dónde parar (no incluido). Por defecto es el final.
  • paso (opcional): cada cuántos caracteres tomar. Por defecto es 1.

La regla clave: el índice final es exclusivo, es decir, no se incluye en el resultado.

0.4 Desarrollo

0.4.1 1. Sintaxis básica

python
texto = "Hello, World!"

# [inicio:fin] - fin no incluido
print(texto[2:5])   # "llo" (índices 2, 3, 4)
print(texto[7:12])  # "World" (índices 7-11)

0.4.2 2. Slice desde el inicio

Omite el inicio para empezar desde el primer carácter:

python
texto = "Hello, World!"
print(texto[:5])   # "Hello" (índices 0-4)
print(texto[:7])   # "Hello, " (índices 0-6)

0.4.3 3. Slice hasta el final

Omite el fin para ir hasta el último carácter:

python
texto = "Hello, World!"
print(texto[7:])   # "World!" (índices 7-12)
print(texto[2:])   # "llo, World!" (índices 2-12)

0.4.4 4. Slice completo

python
texto = "Hello, World!"
print(texto[:])    # "Hello, World!" (copia completa)

0.4.5 5. Índices negativos

Empieza desde el final (último carácter es -1):

python
texto = "Hello, World!"

# Últimos 5 caracteres
print(texto[-5:])   # "orld!"
print(texto[-6:-1]) # "World" (desde -6 hasta antes de -1)
print(texto[-5:-2]) # "orl" (desde -5 hasta antes de -2)

0.4.6 6. Slice con paso ([inicio:fin:paso])

Controlas el salto entre caracteres:

python
texto = "Python"

# Cada 2 caracteres
print(texto[::2])   # "Pto" (índices 0, 2, 4)
print(texto[1::2])  # "yhn" (índices 1, 3, 5)

# Invertir string (paso -1)
print(texto[::-1])  # "nohtyP"

# Desde el final con paso -2
print(texto[::-2])  # "nhy"

0.4.7 7. Tabla de ejemplos de slicing

Slicing Resultado (para “Python”) Explicación
[0:3] "Pyt" Posiciones 0, 1, 2
[2:5] "tho" Posiciones 2, 3, 4
[:4] "Pyth" Desde el inicio hasta posición 3
[3:] "hon" Desde posición 3 hasta el final
[-3:] "hon" Últimos 3 caracteres
[:-2] "Pyth" Hasta antes de los últimos 2
[::2] "Pto" Caracteres en posiciones pares
[::-1] "nohtyP" String invertido

0.5 Ejemplos

Mínimo — Slicing básico:

python
fruta = "Manzana"
print(fruta[0:3])  # "Man"
print(fruta[3:6])  # "ana"
print(fruta[2:5])  # "nza"

Progresivo — Extracción de datos:

python
email = "usuario@gmail.com"

# Extraer nombre de usuario (hasta el @)
nombre_usuario = email[:email.index("@")]
print(nombre_usuario)  # "usuario"

# Extraer dominio (después del @)
dominio = email[email.index("@") + 1:]
print(dominio)  # "gmail.com"

# Extraer extensión (últimos 3 caracteres)
extension = email[-3:]
print(extension)  # "com"

Real — Procesamiento de nombres de archivo:

python
archivo = "documento_2024.pdf"

# Obtener extensión
extension = archivo.split(".")[-1]  # "pdf"
# Con slicing:
punto = archivo.index(".")
extension_slice = archivo[punto + 1:]  # "pdf"

# Obtener nombre sin extensión
nombre_base = archivo[:archivo.index(".")]  # "documento_2024"

# Año (últimos 4 dígitos antes del punto)
año = archivo[-8:-4]  # "2024"

print(f"Archivo: {nombre_base}")
print(f"Extensión: {extension_slice}")
print(f"Año: {año}")

0.6 Errores comunes

Error Síntoma Solución
Índice fuera de rango IndexError: string index out of range Verifica que el índice sea < len(string)
Confundir [inicio:fin] No incluir el último carácter Recuerda: fin no se incluye
Olvidar : Intenta acceder a un solo carácter Usa [inicio:fin] no [inicio, fin]
Índices negativos confusos Resultados inesperados Recuerda: -1 es el último carácter

0.7 Buenas prácticas

  1. Usa índices negativos para “desde el final”:

    python
    # ✅ Obtener últimos 4 caracteres
    ultimos_4 = texto[-4:]
    
    # ❌ Menos claro
    ultimos_4 = texto[len(texto)-4:]
  2. Combina slicing con len() para cortar dinámicamente:

    python
    texto = "Hola mundo"
    # Primeros 3
    texto[:3]
    # Últimos 3
    texto[-3:]
    # Mitad
    mitad = len(texto) // 2
    texto[:mitad]  # Primera mitad
    texto[mitad:]  # Segunda mitad
  3. Usa [::-1] para invertir strings:

    python
    palabra = "Python"
    print(palabra[::-1])  # "nohtyP"
  4. Verifica que los índices sean válidos antes de hacer slicing si no estás seguro:

    python
    texto = "abc"
    # Slice con índices fuera de rango es seguro (no da error)
    print(texto[0:10])  # "abc" (no da error)
    # Pero acceso directo sí da error
    # print(texto[5])  # ❌ IndexError
  5. Usa slicing para copiar strings:

    python
    original = "Hola"
    copia = original[:]  # Crea una copia

0.8 Ejercicio

Intermedio — Manipulación de nombres de archivo

Escribe un programa que:

  1. Tenga un string ruta_archivo = “C:/Users/Ana/Documents/proyecto_final_v2.py”
  2. Extraiga y muestre:
    • El nombre del archivo (última parte después de /)
    • La extensión del archivo
    • El nombre base (sin extensión)
    • La carpeta donde está el archivo (todo antes del último /)
    • Una versión con solo las iniciales de cada carpeta: C:/U/A/D/proyecto_final_v2.py

Pista: usa rfind() para encontrar la última ocurrencia de un carácter, y luego slicing.


Solución (no mires hasta haberlo intentado):

python
ruta_archivo = "C:/Users/Ana/Documents/proyecto_final_v2.py"

# 1. Nombre del archivo (último segmento)
ultimo_slash = ruta_archivo.rfind("/")
nombre_archivo = ruta_archivo[ultimo_slash + 1:]
print(f"Archivo: {nombre_archivo}")  # "proyecto_final_v2.py"

# 2. Extensión
punto = nombre_archivo.rfind(".")
extension = nombre_archivo[punto + 1:]
print(f"Extensión: {extension}")  # "py"

# 3. Nombre base (sin extensión)
nombre_base = nombre_archivo[:punto]
print(f"Nombre base: {nombre_base}")  # "proyecto_final_v2"

# 4. Carpeta (todo antes del último /)
carpeta = ruta_archivo[:ultimo_slash]
print(f"Carpeta: {carpeta}")  # "C:/Users/Ana/Documents"

# 5. Iniciales de carpetas
partes = ruta_archivo.split("/")
iniciales = "/".join([p[:1] if p else "" for p in partes[:-1]]) + "/" + partes[-1]
print(f"Con iniciales: {iniciales}")  # "C:/U/A/D/proyecto_final_v2.py"

0.9 Síntesis

  • Sintaxis: [inicio:fin:paso] donde fin no se incluye.
  • Inicio por defecto: [:fin] empieza desde el principio.
  • Fin por defecto: [inicio:] va hasta el final.
  • Índices negativos: cuentan desde el final (-1 es el último).
  • Paso: controla el salto entre caracteres. [::-1] invierte.
  • Slicing seguro: índices fuera de rango no dan error (a diferencia de acceso directo).
  • Strings inmutables: el slicing devuelve un nuevo string, no modifica el original.

0.10 Qué sigue

  • Relacionado: métodos de string, indexación, f-strings
  • Siguiente tema: Métodos de strings — aprende todas las herramientas para manipular texto.

Cómo citar

Achalma, E. (2026, 20 de octubre). Rebanado de cadenas. Numerus Scriptum. https://numerus-scriptum.netlify.app/cursos/python/rebanado-de-cadenas/

Esc
elegir abrir Esc cerrar