Curso de Expresiones Regulares

Python regex para análisis de archivos CSV

Curso de Expresiones Regulares

Contenido del curso

Expresiones Regulares en lenguajes de programación

Python regex para análisis de archivos CSV

Resumen

Python y las expresiones regulares ofrecen una combinación potente para extraer datos de archivos CSV con precisión y velocidad. Con un patrón bien pensado, es posible filtrar partidos, capturar fechas, países y marcadores, y hasta sumar goles sin transformar previamente el archivo en estructuras complejas. Aquí verás cómo se arma el flujo completo, desde el shebang hasta la precompilación del patrón y el manejo de grupos.

¿Por qué Python y expresiones regulares aceleran el análisis de datos?

Python es un lenguaje rápido, potente y amigable para scripts de análisis de datos. Su módulo re permite compilar un patrón y reutilizarlo, lo que mejora el rendimiento en archivos grandes. Además, su sintaxis clara facilita centrarse en el patrón y no en el “pegamento” del código.

  • Shebang y ejecución directa: usar la primera línea con #! indica el binario, por ejemplo en /usr/bin/python, y permite ejecutar con permisos sin invocar el intérprete manualmente.
  • Sintaxis de patrones limpia: usar cadenas crudas con r'' evita escapar innecesario y mantiene el patrón legible.
  • Precompilación con re.compile: el patrón queda listo en memoria para hacer match repetidamente de forma eficiente.
  • Uso en back end: en servidores web como Apache o NGINX, las expresiones regulares ayudan a mapear rutas a queries GET (ejemplo: rutas tipo flickr.com/photos/usuario/id), reduciendo capas intermedias y acelerando el flujo.

¿Cómo implementar el patrón en Python paso a paso?

El flujo va de menos a más: leer, compilar, hacer match, capturar grupos y filtrar por criterios como friendly.

¿Cómo leer el archivo CSV con seguridad?

  • Abrir el archivo en modo lectura.
  • Iterar línea a línea.
  • Cerrar el archivo al finalizar.
#!/usr/bin/python import re f = open('files/results.csv', 'r') for line in f: print(line) f.close()
  • Si ves “dobles líneas” al imprimir, suele ser por el salto de línea incluido en cada línea más el de print.

¿Cómo compilar y agrupar con re.compile?

  • Emplear cadenas crudas r'' para los patrones.
  • Anclas ^ y $ para controlar el inicio y fin de línea.
  • Agrupar con paréntesis para extraer datos concretos (por ejemplo, el año).
pat = re.compile(r'^(\d{4})-.*$') # grupo 1: año f = open('files/results.csv', 'r') for line in f: res = pat.match(line) if res: print(res.group(1)) # imprime el año f.close()
  • Evitar \w para nombres de países con caracteres especiales. Conviene capturar “todo hasta la coma” con [^,]+.

¿Cómo filtrar por friendly y extraer grupos?

  • Para traer solo partidos amistosos, se puede buscar la secuencia ,friendly, en la línea.
  • Capturar fecha, local, visitante y marcador en un solo match.
pat = re.compile( r'^(\d{4}-\d{2}-\d{2}),([^,]+),([^,]+),(\d+)-(\d+),.*?,friendly,.*$' ) f = open('files/results.csv', 'r') for line in f: res = pat.match(line) if res: fecha = res.group(1) local = res.group(2) visita = res.group(3) g_local = res.group(4) g_vis = res.group(5) print(fecha, local, visita, g_local, g_vis) f.close()
  • Este filtro asume que friendly aparece como un campo entre comas. Si friendly pudiera aparecer dentro del nombre de un país, habría falsos positivos; por eso se acota con comas.

¿Cómo operar con grupos y detectar partidos con muchos goles?

Una vez capturado el marcador, hacer cast a entero habilita operaciones numéricas como sumas y comparaciones por umbrales.

  • Patrón general (sin friendly) para leer fecha, equipos y goles.
pat = re.compile(r'^(\d{4}-\d{2}-\d{2}),([^,]+),([^,]+),(\d+)-(\d+),.*$') f = open('files/results.csv', 'r') for line in f: res = pat.match(line) if not res: continue fecha = res.group(1) local = res.group(2) visita = res.group(3) g_local = int(res.group(4)) g_vis = int(res.group(5)) total = g_local + g_vis if total > 10: print("%d goles: %s vs %s en %s" % (total, local, visita, fecha)) f.close()
  • Cast: convertir con int() desde strings permite sumar y comparar.
  • Formateo: con “%d” y “%s” se arma una salida tipo printf, clara y directa.

Resultados ilustrativos mencionados:

  • Se detectaron “festivales” de goles con umbrales > 10; se contó un total de 206 partidos oficiales por encima de ese valor.
  • Destaca un 31-0 en Australia vs American Samoa, un caso extremo de goleada.
  • También se estimaron 13209 partidos “menores que uno” (cero goles), es decir, 0-0.

Buenas prácticas derivadas del flujo:

  • Precompilar el patrón con re.compile para reutilizarlo sin degradar el rendimiento en archivos grandes.
  • Anclar y agrupar inteligentemente: ^ y $ para límites; grupos para año, fecha, equipos y goles.
  • Evitar \w en nombres con tildes o caracteres especiales; usar [^,]+ entre comas.
  • Cerrar archivos y probar incrementando complejidad: primero leer todo, luego agregar el patrón, después añadir filtros y operaciones.

¿Te gustaría explorar otros filtros, como diferenciar oficiales de amistosos, o imprimir marcadores locales y visitantes por separado? Comparte tu idea y la resolvemos juntos con un patrón claro y eficiente.