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ón | Significado |
|---|---|
\d | Dígito |
\w | Letra o número |
\s | Espacio |
. | 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:
DNI español (8 números + letra)
Ejemplo válido:
12345678Z
Teléfono español
9 dígitos, puede empezar por 6, 7, 8 o 9
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