Expresiones regulares - Agrupación y referencias

En las expresiones regulares,la agrupación(Grouping) nos permite tratar múltiples caracteres como una sola unidad, como los paréntesis en matemáticas. La agrupación tiene principalmente dos funciones:

  1. Tratar múltiples caracteres como un todo: se pueden aplicar cuantificadores a este conjunto (como*、+、?、{n})
  2. Capturar el contenido coincidente: se puede hacer referencia o extraer esta parte del contenido coincidente más adelante.

Sintaxis básica

Usando paréntesis()para crear agrupaciones:

(expresión)

Por ejemplo,(ab)+puede coincidir con "ab", "abab", "ababab", etc., pero no con "a" ni "b".


Tipos de agrupación

En las expresiones regulares existen varios tipos diferentes de agrupación:

1. Grupo de captura (Capturing Group)

Es la forma más común de agrupación; captura el contenido coincidente y asigna un número (comenzando desde 1).

Ejemplo

(\d{4})-(\d{2})-(\d{2})# Coincidir con el formato de fecha YYYY-MM-DD

Esta expresión creará 3 grupos:

  • Grupo 1: año de 4 dígitos
  • Grupo 2: mes de 2 dígitos
  • Grupo 3: día de 2 dígitos

2. Grupo sin captura (Non-capturing Group)

Usa(?:expresión)sintaxis, indica que solo agrupa pero no captura.

Ejemplo

(?:Mr|Ms|Mrs)\. (\w+)# Coincidir"Mr. Smith"pero solo captura"Smith"

3. Grupo de captura con nombre (Named Capturing Group)

Asigna un nombre al grupo para mejorar la legibilidad (la sintaxis puede variar según el lenguaje).

Ejemplo en Python:

Ejemplo

(?P<year>\d{4})-(?P<month>\d{2})-(?P<day>\d{2})

Ejemplo en JavaScript:

Ejemplo

(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})

Referencias a agrupaciones

Una de las funciones más potentes de la agrupación es poder hacer referencia al contenido coincidente dentro o fuera de la expresión regular.

1. Retroreferencia (Backreference)

Para hacer referencia a un grupo anterior dentro de la expresión regular, usa\númerosintaxis:

Ejemplo

(\w+) \1# Coincide con palabras duplicadas, como"hello hello"

Este patrón coincidirá con dos palabras idénticas separadas por un espacio.

2. Retroreferencia con nombre

Para grupos con nombre, se puede hacer referencia utilizando el nombre:

Ejemplo

(?P<word>\w+) (?P=word)# Sintaxis de Python
\k<word># Sintaxis de JavaScript

3. Referencia en sustitución

Hacer referencia al contenido de un grupo en operaciones de reemplazo:

Ejemplo en Python:

Ejemplo

import re
text = "2023-05-15"
new_text = re.sub(r'(\d{4})-(\d{2})-(\d{2})', r'\2/\3/\1', text)
# Resultado: "05/15/2023"

Ejemplo en JavaScript:

Ejemplo

let text = "2023-05-15";
let newText = text.replace(/(\d{4})-(\d{2})-(\d{2})/, '$2/$3/$1');
// Resultado: "05/15/2023"

Ejemplos de aplicación práctica

Ejemplo 1: Coincidir con etiquetas HTML

Ejemplo

<([a-z][a-z0-9]*)\b[^>]*>.*?</\1>

Este patrón puede coincidir con etiquetas HTML pareadas (como<div>...</div>), donde:

  • ([a-z][a-z0-9]*)Captura el nombre de la etiqueta
  • \1Hace referencia al nombre de la etiqueta capturado anteriormente para asegurar la coherencia.

Ejemplo 2: Validar palabras duplicadas

Ejemplo

\b(\w+)\b\s+\1\b

Puede encontrar palabras consecutivamente duplicadas en el texto.

Ejemplo 3: Conversión de formato de fecha

Código Python:

Ejemplo

import re

date = "2023-12-25"
# Convertir YYYY-MM-DD a DD/MM/YYYY
new_date = re.sub(r'(\d{4})-(\d{2})-(\d{2})', r'\3/\2/\1', date)
print(new_date)  # Salida: 25/12/2023

Aplicaciones avanzadas de agrupación

1. Coincidencia condicional

Algunos motores de expresiones regulares admiten coincidencia condicional basada en grupos:

Ejemplo

(?(1)true-pattern|false-pattern)

Indica que si el grupo 1 ha coincidido, se empareja true-pattern; de lo contrario, se empareja false-pattern.

2. Grupo equilibrado (característica avanzada)

Se utiliza para coincidir con estructuras anidadas (como paréntesis) y requiere soporte de un motor de expresiones regulares específico.


Problemas comunes y trampas

  1. Uso excesivo de agrupaciones: las agrupaciones innecesarias pueden afectar el rendimiento.

    • Mal ejemplo:(a)|(b)(Si no se necesita capturar, se debe usar(?:a|b))
  2. Confusión de numeración de grupos:

    • Los números de los grupos comienzan en 1 según el orden de los paréntesis izquierdos.
    • Los grupos sin captura no participan en la numeración.
  3. Problema de coincidencia codiciosa:

    <(.*)>  # coincidirá de forma codiciosa hasta el último >

    Se debe usar:

    <(.*?)>  # coincidencia no codiciosa

Desafíos de práctica

  1. Escribe una expresión regular que coincida con nombres de usuario de correo duplicados (como[email protected];[email protected])
  2. Convierte el formato de número de teléfono, de(123) 456-7890llegar123-456-7890
  3. Extrae todos los atributos de las etiquetas HTML (como<img src="..." alt="...">src y alt en

Puntos clave de resumen

Concepto Sintaxis Uso
Grupo de captura (pattern) Captura el contenido coincidente y asigna un número.
Grupo sin captura (?:pattern) Agrupa pero no captura.
Grupo con nombre (?P<name>pattern) (Python) Asigna un nombre al grupo.
Retroreferencia \1, \2esperar Hace referencia a un grupo coincidente anterior.
Retroreferencia con nombre (?P=name) (Python) Hace referencia a un grupo por su nombre.
Referencia en sustitución $1, $2o\1, \2 Hace referencia a un grupo en la cadena de reemplazo.

Dominar las funciones de agrupación y referencia de las expresiones regulares te permite:

  • Construir patrones de coincidencia más complejos.
  • Extraer y procesar partes específicas de cadenas.
  • Implementar conversiones inteligentes de cadenas.
  • Validar estructuras de texto complejas.
Otras extensiones