QuieroProgramar por Rodri Gonzalez
Python · Lección 23 de 27

Strings avanzado

En la lección 12 cubrimos los métodos básicos. Ahora vamos al nivel avanzado: slicing profundo, expresiones regulares con re, encoding, raw strings y f-strings con expresiones complejas. Estas herramientas son las que usás para limpiar datos realmente sucios.

90–110 min Prerrequisitos: 12 Métodos de strings, 18 Funciones
01

Concepto teórico

Slicing profundo de strings

Los strings en Python son secuencias de caracteres y soportan el mismo slicing que las listas: string[inicio:fin:paso]. Algunos patrones útiles que no vimos antes:

Slice Resultado (con "ABCDEFGH") Uso
s[::2] "ACEG" Caracteres en posición par
s[::-1] "HGFEDCBA" Invertir un string
s[2:5] "CDE" Extraer subcadena
s[-4:] "EFGH" Últimos 4 caracteres
s[:4] "ABCD" Primeros 4 caracteres

Recordá: los strings son inmutables. No podés hacer s[0] = "Z". Cada operación de slicing devuelve un nuevo string.

Repetición y multiplicación de strings

El operador * repite un string: "─" * 40 genera una línea de 40 guiones. Muy útil para formatear reportes y separadores.

Multiline strings y raw strings

Triple comillas ("""...""" o '''...''') permiten strings que ocupan varias líneas, preservando saltos de línea y espacios:

consulta_sql = """
SELECT nombre, score, saldo
FROM clientes
WHERE score >= 650
ORDER BY saldo DESC
"""

Raw strings (r"...") no interpretan escapes. Son esenciales para regex y paths de Windows:

normal = "C:\nueva\carpeta"   # \n se interpreta como salto de línea!
raw = r"C:\nueva\carpeta"     # se mantiene literal
regex = r"\d{2}-\d{8}-\d"     # patrón de CUIT sin escapar

Encoding: UTF-8, Latin-1 y el caos de la Ñ

Los strings de Python 3 son Unicode nativamente. Pero cuando leés archivos de otras fuentes (Excel viejos, CSVs de sistemas legacy), podés encontrarte con encodings distintos:

Error clásico de encoding: UnicodeDecodeError al leer un CSV. Esto pasa cuando el archivo está en Latin-1 pero Python intenta leerlo como UTF-8. Solución: pd.read_csv("archivo.csv", encoding="latin-1"). En datos argentinos, esto pasa MUY seguido con exports de MERCAP, SINENSUP y sistemas bancarios legacy.

Expresiones regulares (regex) con el módulo re

Las expresiones regulares son patrones que describen texto. Son la herramienta más poderosa para buscar, extraer y reemplazar patrones complejos en strings. El módulo re de Python las implementa.

Patrón Significado Ejemplo match
\d Un dígito (0-9) "5"
\d{8} Exactamente 8 dígitos "12345678"
\w Letra, dígito o _ "a", "3", "_"
\s Espacio, tab, newline " "
. Cualquier carácter (excepto newline) "x"
+ 1 o más del anterior \d+"123"
* 0 o más del anterior \d*"" o "5"
? 0 o 1 del anterior \d?"" o "5"
[abc] Cualquiera de a, b, c "a"
(grupo) Captura un grupo Extraer partes del match
^ Inicio del string
$ Fin del string

Las funciones principales de re:

Siempre usá raw strings para regex: r"\d{2}-\d{8}-\d". Sin el r, Python interpreta \d como un escape (que no existe) y puede dar resultados inesperados. Con r, el patrón llega intacto al motor de regex.
En análisis de datos: regex es indispensable para: (1) extraer CUITs, teléfonos, emails de texto libre, (2) limpiar montos con formatos mixtos ($1.500,00 vs 1500.00 vs $1,500), (3) validar formatos de datos, (4) parsear logs y archivos semi-estructurados. En pandas: df["col"].str.extract(r"patron") usa regex directamente.
Tip: no necesitás memorizar toda la sintaxis de regex. Lo que necesitás es saber que existe, y usar regex101.com para construir y testear patrones interactivamente. Es la herramienta más útil para regex.
02

Ejemplos explicados paso a paso

Ejemplo 1: Slicing avanzado y manipulación

ejemplo_01_slicing.pyPython

        
Hacé clic en ▶ Ejecutar

Ejemplo 2: Raw strings, multiline y encoding

ejemplo_02_raw_multiline.pyPython

        
Hacé clic en ▶ Ejecutar

Ejemplo 3: Regex básico — search, findall, sub

ejemplo_03_regex_basico.pyPython

        
Hacé clic en ▶ Ejecutar

Ejemplo 4: Regex con grupos — extraer datos estructurados

ejemplo_04_regex_grupos.pyPython

        
Hacé clic en ▶ Ejecutar

Ejemplo 5: f-strings con expresiones complejas

ejemplo_05_fstrings_avanzado.pyPython

        
Hacé clic en ▶ Ejecutar
03

Referencia rápida

Función re Qué hace Devuelve
re.search(p, t) Busca primera coincidencia Match object o None
re.match(p, t) Busca solo al inicio Match object o None
re.findall(p, t) Todas las coincidencias Lista de strings
re.sub(p, r, t) Reemplaza coincidencias Nuevo string
re.split(p, t) Divide por patrón Lista
re.compile(p) Pre-compila patrón Pattern object
Regex patrón Significado Ejemplo
\d Dígito "5"
\d+ 1+ dígitos "123"
\d{8} Exactamente 8 dígitos "12345678"
\w+ Palabra (letras/dígitos/_) "hola_42"
\s Espacio/tab " "
[^0-9] Todo excepto dígitos "$", ","
(grupo) Capturar grupo match.group(1)
^...$ Inicio a fin (exacto) Validación completa
04

Ejercicios

Nivel 1 · Básico

Ejercicio 1: Invertir un string

Dado texto = "Python", invertilo con slicing. Debe incluir nohtyP.

ejercicio_01.pyDebe incluir "nohtyP"

          
Hacé clic en ▶ Ejecutar
Nivel 1 · Básico

Ejercicio 2: Extraer partes de un CBU

Dado cbu = "2850590940090418135201", extraé los 3 primeros dígitos (banco), los siguientes 4 (sucursal) y el último (verificador). Debe incluir 285.

ejercicio_02.pyDebe incluir "285"

          
Hacé clic en ▶ Ejecutar
Nivel 1 · Básico

Ejercicio 3: re.findall para extraer números

Dado "Ventas: $1500, $3200, $800", extraé todos los números con re.findall(). Debe incluir 3200.

ejercicio_03.pyDebe incluir "3200"

          
Hacé clic en ▶ Ejecutar
Nivel 2 · Intermedio

Ejercicio 4: Validar CUIT con regex

Creá una función validar_cuit(cuit) que use regex para verificar formato XX-XXXXXXXX-X. Probá con "20-30123456-9" (válido) y "abc-123-x" (inválido). Debe incluir True.

ejercicio_04.pyDebe incluir "True"

          
Hacé clic en ▶ Ejecutar
Nivel 2 · Intermedio

Ejercicio 5: re.sub para limpiar montos

Dado "$1,250,000.50", usá re.sub() para eliminar todo excepto dígitos y punto. Convertí a float. Debe incluir 1250000.5.

ejercicio_05.pyDebe incluir "1250000.5"

          
Hacé clic en ▶ Ejecutar
Nivel 2 · Intermedio

Ejercicio 6: Extraer emails con regex

Dado un texto con 3 emails, extraelos todos con re.findall(). Debe incluir @.

ejercicio_06.pyDebe incluir "@"

          
Hacé clic en ▶ Ejecutar
Nivel 3 · Avanzado

Ejercicio 7: Regex con grupos para parsear CUIT

Usá grupos de captura (\d{2})-(\d{8})-(\d) para extraer las 3 partes de "20-30123456-9". Debe incluir 30123456.

ejercicio_07.pyDebe incluir "30123456"

          
Hacé clic en ▶ Ejecutar
Nivel 3 · Avanzado

Ejercicio 8: Ocultar datos sensibles con re.sub

Dado "DNI 30123456, Tel +54-11-4567-8901", ocultar el DNI con X y los últimos 4 dígitos del teléfono con *. Debe incluir XXXXXXXX.

ejercicio_08.pyDebe incluir "XXXXXXXX"

          
Hacé clic en ▶ Ejecutar
Nivel 3 · Avanzado

Ejercicio 9: Limpiar lista de montos con formatos mixtos

Tenés ["$1,500.00", "AR$23.450", "1500", "$-200", "N/A"]. Usá regex para extraer el valor numérico de cada uno, ignorando los inválidos. Debe incluir Total.

ejercicio_09.pyDebe incluir "Total"

          
Hacé clic en ▶ Ejecutar
Nivel 4 · Desafío

Ejercicio 10: Parser de registros con regex completo

Dado un texto con registros semi-estructurados, extraé nombre, CUIT y monto de cada línea usando regex con grupos. Armá una lista de diccionarios. Debe incluir registros.

ejercicio_10_desafio.pyDebe incluir "registros"

          
Hacé clic en ▶ Ejecutar
05

Resumen y conexión

En la siguiente lección (24 · Archivos) vas a aprender a leer y escribir archivos: texto, CSV, JSON y Excel. El puente entre tu código y los datos del mundo real.

Recursos: Python docs — re · regex101.com (tester)