regex-lookarounds

Lookarounds en Regex

Los lookarounds son patrones que permiten realizar coincidencias condicionales, basándonos en lo que está alrededor (antes o después) del patrón que estamos buscando.

Se dividen en dos categorías principales:

  • Lookaheads: Verifican si un patrón sigue a otro patrón.
  • Lookbehinds: Verifican si un patrón precede a otro patrón.

Ambos tipos de lookarounds no consumen caracteres en la cadena de texto. Es decir, que no forman parte de la coincidencia final.

Para usar los lookarounds, empleamos la siguiente sintaxis

TipoSintaxis
Lookahead positivo(?=patrón)
Lookahead negativo(?!patrón)
Lookbehind positivo(?<=patrón)
Lookbehind negativo(?<!patrón)

¿Podían haberlo hecho más complicado y menos intuitivo? Posiblemente no 😆

Cómo usar lookahead

Lookahead positivo

El lookahead positivo (?=patrón) verifica si un patrón específico sigue inmediatamente después de otro patrón. Si se cumple la condición, la coincidencia se realiza.

Por ejemplo, imaginemos que queremos encontrar todas las palabras que son seguidas por un signo de exclamación.

¡Hola! ¿Cómo estas? ¡Esto es genial!

En este caso,

  • \w+ coincide con las palabras
  • (?=!) asegura que sean seguidas por un signo de exclamación.

Lookahead negativo

El lookahead negativo (?!patrón) verifica que un patrón específico no siga a otro patrón. Si la condición se cumple (es decir, no se encuentra el patrón), se realiza la coincidencia.

Por ejemplo, supongamos que queremos encontrar palabras que no son seguidas por un signo de interrogación.

¡Hola! ¿Como estas? ¡Esto es increible!

Aquí,

  • \w+\b coincide con las palabras
  • (?!\?) asegura que no sean seguidas por un signo de interrogación.

Cómo usar lookbehind

Lookbehind positivo

El lookbehind positivo (?<=patrón) verifica que un patrón específico precede a otro patrón. Si se cumple la condición, se realiza la coincidencia.

Imaginemos que queremos encontrar todas las letras que son precedidas por un signo de dólar.

text = "El precio es $10 y el descuento es $2."
pattern = r'(?<=\$)\d+'

matches = re.findall(pattern, text)
print(matches)  # ['10', '2']
El precio es $10 y el descuento es $2.

En este caso,

  • (?<=\$) asegura que el número esté precedido por un signo de dólar
  • En este caso, lo cumple 10 y 2

Lookbehind negativo

El lookbehind negativo (?<!patrón) verifica que un patrón específico no preceda a otro patrón. Si la condición se cumple (es decir, no se encuentra el patrón), se realiza la coincidencia.

Supongamos que queremos encontrar números que no estén precedidos por un signo de dólar.

El precio es $10 y el descuento es $2.

Aquí,

  • (?<!\$) asegura que el número no esté precedido por un signo de dólar
  • En este caso, solo se cumple el 0 del primer $10.