Expresiones Regulares (RE)

 Las expresiones regulares (regex) son patrones que permiten buscar, validar o transformar texto de forma muy precisa.

Python usa el módulo:

import re

1. Búsqueda básica: re.search()

Busca un patrón en un texto. Devuelve un objeto si lo encuentra, o None si no.

import re

texto = "Mi número es 654321987"
patron = r"\d+"   # uno o más dígitos

resultado = re.search(patron, texto)
print(resultado.group())   # 654321987

2. Encontrar todos los resultados: re.findall()

re.findall(r"\d+", "Tengo 2 gatos y 3 perros")
# ['2', '3']

3. Reemplazar texto: re.sub()

texto = "Hola123Mundo456"
nuevo = re.sub(r"\d+", "-", texto)
print(nuevo)   # Hola-Mundo-

4. Validar patrones: re.fullmatch()

email = "usuario@mail.com"

if re.fullmatch(r"[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}", email):
    print("Email válido")
else:
    print("Email inválido")

5. Grupos de captura

Permiten extraer partes concretas del texto.

texto = "Nombre: Ana, Edad: 22"
patron = r"Nombre: (\w+), Edad: (\d+)"

m = re.search(patron, texto)
print(m.group(1))  # Ana
print(m.group(2))  # 22

6. Patrones más comunes

PatrónSignificado
\dDígito
\wLetra o número
\sEspacio
.Cualquier carácter
+Uno o más
*Cero o más
?Opcional
{n,m}Entre n y m repeticiones
^Inicio
$Final

Ejemplo: ^\d{9}$ → exactamente 9 dígitos (DNI sin letra)

ACTIVIDAD PRÁCTICA: “Validador avanzado de datos”

Objetivo: que tus alumnos usen expresiones regulares para validar datos reales.

Enunciado

Crea un programa que valide:

  1. DNI español (8 números + letra)

    • Ejemplo válido: 12345678Z

  2. Teléfono español

    • 9 dígitos, puede empezar por 6, 7, 8 o 9

  3. Contraseña segura

    • Mínimo 8 caracteres

    • Al menos una mayúscula

    • Al menos una minúscula

    • Al menos un número

    • Al menos un símbolo

El programa debe pedir los tres datos y mostrar si cada uno es válido o no.

Pistas

  • DNI: ^\d{8}[A-Za-z]$

  • Teléfono: ^[6789]\d{8}$

  • Contraseña: usar lookaheads:

    • (?=.*[A-Z])

    • (?=.*[a-z])

    • (?=.*\d)

    • (?=.*[@$!%*?&])

Solución propuesta

import re

def validar_dni(dni):
    patron = r"^\d{8}[A-Za-z]$"
    return re.fullmatch(patron, dni) is not None

def validar_telefono(tel):
    patron = r"^[6789]\d{8}$"
    return re.fullmatch(patron, tel) is not None

def validar_contraseña(pwd):
    patron = r"^(?=.*[A-Z])(?=.*[a-z])(?=.*\d)(?=.*[@$!%*?&]).{8,}$"
    return re.fullmatch(patron, pwd) is not None


dni = input("Introduce tu DNI: ")
telefono = input("Introduce tu teléfono: ")
password = input("Introduce tu contraseña: ")

print("\nResultados:")
print("DNI válido:", validar_dni(dni))
print("Teléfono válido:", validar_telefono(telefono))
print("Contraseña válida:", validar_contraseña(password))

Ejemplo de salida

Introduce tu DNI: 12345678Z
Introduce tu teléfono: 612345678
Introduce tu contraseña: Hola123!

Resultados:
DNI válido: True
Teléfono válido: True
Contraseña válida: True