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.
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:
- UTF-8: estándar universal. Soporta todos los caracteres. Siempre preferí UTF-8.
- Latin-1 (ISO 8859-1): viejo estándar europeo. Muchos CSVs argentinos vienen en Latin-1 porque los sistemas legacy lo usaban. La Ñ, las tildes y los signos de peso funcionan, pero otros caracteres no.
- ASCII: solo inglés básico. Sin tildes, sin Ñ, sin ñ. Limitadísimo.
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:
re.search(patron, texto)— busca la primera coincidencia en cualquier partere.match(patron, texto)— busca solo al INICIO del stringre.findall(patron, texto)— devuelve TODAS las coincidencias como listare.sub(patron, reemplazo, texto)— reemplaza todas las coincidenciasre.compile(patron)— pre-compila un patrón para uso repetido (más rápido)
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.
df["col"].str.extract(r"patron") usa regex directamente.
Ejemplos explicados paso a paso
Ejemplo 1: Slicing avanzado y manipulación
Hacé clic en ▶ Ejecutar
Ejemplo 2: Raw strings, multiline y encoding
Hacé clic en ▶ Ejecutar
Ejemplo 3: Regex básico — search, findall, sub
Hacé clic en ▶ Ejecutar
Ejemplo 4: Regex con grupos — extraer datos estructurados
Hacé clic en ▶ Ejecutar
Ejemplo 5: f-strings con expresiones complejas
Hacé clic en ▶ Ejecutar
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 |
Ejercicios
Ejercicio 1: Invertir un string
Dado texto = "Python", invertilo con slicing. Debe incluir nohtyP.
Hacé clic en ▶ Ejecutar
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.
Hacé clic en ▶ Ejecutar
Ejercicio 3: re.findall para extraer números
Dado "Ventas: $1500, $3200, $800", extraé todos los números con re.findall(). Debe
incluir 3200.
Hacé clic en ▶ Ejecutar
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.
Hacé clic en ▶ Ejecutar
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.
Hacé clic en ▶ Ejecutar
Ejercicio 6: Extraer emails con regex
Dado un texto con 3 emails, extraelos todos con re.findall(). Debe incluir @.
Hacé clic en ▶ Ejecutar
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.
Hacé clic en ▶ Ejecutar
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.
Hacé clic en ▶ Ejecutar
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.
Hacé clic en ▶ Ejecutar
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.
Hacé clic en ▶ Ejecutar
Resumen y conexión
- Slicing de strings:
[::-1]invierte,[:3]primeros 3,[-4:]últimos 4. - Raw strings (
r"...") son esenciales para regex y paths de Windows. - Multiline strings (
"""...""") preservan saltos de línea — ideales para SQL queries. - Encoding: UTF-8 por defecto. Si un CSV falla, probá
encoding="latin-1". re.findall()extrae coincidencias,re.sub()reemplaza,re.match()valida.- Siempre usá raw strings para patrones regex:
r"\d{2}-\d{8}-\d". - f-strings admiten expresiones, llamadas a funciones y operadores ternarios.
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)