Patrones con re
Veamos cómo validar si una dirección de correo está bien escrita. Aunque es algo que el ser humano ve en un golpe de vista, validar esto en programación es un poco más complicado.
- ❌
esto@no.es@un.correo@valido
Dirección de correo no válida. - ✅
nombre@dominio.es
Dirección de correo válida.
Para resolver este problema usaremos las expresiones regulares o regular expressions. Estas nos permiten buscar patrones en texto. Este ejemplo nos permite detectar números en una cadena. Como puedes ver se detectó el 2
y el 3
.
import re
r1 = re.findall(r"\d+", "Tengo 2 gatos y 3 perros")
print(r1) # ['2', '3']
También podemos reemplazar texto. En este caso reemplazamos 2
y 3
por dos
y tres
respectivamente.
r2 = re.sub(r"2", "dos", "Tengo 2 gatos y 3 perros")
r2 = re.sub(r"3", "tres", r2)
print(r2)
# Tengo dos gatos y tres perros
Pero también validar que un texto cumple con unas normas. Por ejemplo, sabemos que un correo electrónico como usuario@gmail.com
está compuesto por:
- 👤 Un nombre de
usuario
. - 🌐 Seguido de
@
. - 🏢 Un dominio como
gmail
. - 🔗 Un TLD como
.com
.
Podemos por tanto escribir una expresión que nos diga si una dirección de correo es válida o no de la siguiente manera.
def valida_email(email):
usuario = r"[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+"
arroba = r"@"
dominio = r"[a-zA-Z0-9-]+"
tld = r"(?:\.[a-zA-Z0-9-]+)*"
email_regex = rf"^{usuario}{arroba}{dominio}{tld}$"
return re.match(email_regex, email) is not None
print(valida_email("juan@gmail.com")) # True
print(valida_email("juan@gmail.com.ar")) # True
print(valida_email("653fsaasd")) # False
print(valida_email("juan@gma@.dom.com")) # False
print(valida_email("@@@")) # False
Puede parecer complicado, así que veamos parte por parte:
- 👤
usuario
: Para el nombre de usuario se permiten números, minúsculas, mayúsculas y algunos caracteres raros. Por ejemplo[a-zA-Z0-9]+
indica que se permiten números, minúsculas y mayúsculas. El+
indica que buscamos uno o muchos caracteres de este tipo. El resto como!
o$
indica que estos caracteres también son permitidos. - 🌐
arroba
: Buscamos que la@
esté presente en el lugar adecuado. - 🏢
dominio
: Requerimos un dominio con números, minúsculas, mayúsculas y guiones. - 🔗
tld
: Requiere que empiece con un.
y permitimos múltiples. Es decir,.com
yco.uk
son válidos.
✏️ Ejercicios:
- Modifica la función para que solo permita dominios
.com
. - Modifica la función para que no admita dominios
@google
.