Python Advanced Series — Regex

13. Regex con Named Capture Groups

13. Regex with Named Capture Groups

Extrae múltiples piezas de información de un log de servidor en un solo paso, asignándolas directo a variables con nombre.

Extract multiple pieces of information from a server log in one step, assigning them directly to named variables.

⚠️ Advertencia de ciberseguridad y producción ⚠️ Cybersecurity and production warning

Este ejercicio es solo para aprendizaje y pruebas. No ejecutes scripts contra datos reales, ambientes de producción, APIs externas, portales con login, datos sensibles, sistemas críticos o repositorios empresariales sin autorización, respaldos, pruebas previas, permisos mínimos, control de cambios y cumplimiento de los protocolos de ciberseguridad de tu organización.

This exercise is for learning and testing only. Do not run scripts against real data, production environments, external APIs, login portals, sensitive data, critical systems, or enterprise repositories without authorization, backups, prior testing, least-privilege permissions, change control, and compliance with your organization's cybersecurity protocols.

Objetivo del ejercicio

Exercise objective

Crear expresiones regulares con grupos nombrados para transformar texto no estructurado en columnas claras.

Create regular expressions with named groups to transform unstructured text into clear columns.

Datos sintéticos

Synthetic data

log_line
10.0.0.1 - Admin - ERROR
10.0.0.2 - Maria - OK
10.0.0.3 - John - WARNING

Ejemplo base

Base example

import re

log = "10.0.0.1 - Admin - ERROR"
patron = r"(?P<ip>[\d.]+)\s-\s(?P<usuario>\w+)\s-\s(?P<estado>\w+)"
match = re.search(patron, log)

print(match.groupdict())
# {'ip': '10.0.0.1', 'usuario': 'Admin', 'estado': 'ERROR'}

Resultado esperado

Expected result

ipusuarioestado
10.0.0.1AdminERROR
10.0.0.2MariaOK
10.0.0.3JohnWARNING

Script completo

Complete script

# ==========================================================
# Python Advanced Topic 13
# Regex with Named Capture Groups
# ==========================================================

import re
import pandas as pd

logs = [
    "10.0.0.1 - Admin - ERROR",
    "10.0.0.2 - Maria - OK",
    "10.0.0.3 - John - WARNING",
]

pattern = r"(?P<ip>[\d.]+)\s-\s(?P<usuario>\w+)\s-\s(?P<estado>\w+)"

records = []
for line in logs:
    match = re.search(pattern, line)
    if match:
        records.append(match.groupdict())
    else:
        records.append({"ip": None, "usuario": None, "estado": None})

df = pd.DataFrame(records)
df.to_csv("parsed_server_logs.csv", index=False)
print(df)

Salida esperada en consola

Expected console output

         ip usuario   estado
0  10.0.0.1   Admin    ERROR
1  10.0.0.2   Maria       OK
2  10.0.0.3    John  WARNING

Aplicaciones reales

Real-world applications

  • Parsear logs de servidores.
  • Extraer emails, teléfonos o IDs de texto.
  • Convertir archivos TXT en tablas.
  • Preparar eventos para auditoría.
  • Parse server logs.
  • Extract emails, phones, or IDs from text.
  • Convert TXT files into tables.
  • Prepare events for audit.

Recomendaciones

Recommendations

  • Probar regex con casos buenos y malos.
  • Usar grupos nombrados para mantener claridad.
  • Registrar líneas que no hacen match.
  • Evitar regex demasiado frágiles.
  • Test regex with good and bad cases.
  • Use named groups for clarity.
  • Log lines that do not match.
  • Avoid overly fragile regex patterns.

Valor del tópico

Topic value

Named capture groups convierten texto difícil en columnas comprensibles, reduciendo errores al parsear logs o reportes no estructurados.

Named capture groups turn difficult text into understandable columns, reducing errors when parsing logs or unstructured reports.