Extraer todos los emails válidos de una cadena de texto, utilizando el módulo string y expresiones regulares - Python
Por Víctor Aracil - febrero 15, 2023
Esta función en Python te servirá para sacar todos los correos electrónicos válidos de una cadena de texto.
En primer lugar nos serviremos del módulo string, y dos bucles for con las condiciones necesarias para cumplir nuestro propósito. Y como segunda solución, utilizaremos expresiones regulares importando el módulo re.# Función que nos servirá para extraer todos los email válidos de una cadena
import string
def emails_cadena(cadena):
try:
# Definimos una lista de signos de puntuación a eliminar, excepto @ y .
caracteres_puntuacion = string.punctuation.replace('@', '').replace('.', '')
# Eliminamos todos los caracteres de puntuación de la cadena, que no se usan en los correos electrónicos
traductor = str.maketrans("","", caracteres_puntuacion)
cadena_sin_puntuacion = cadena.translate(traductor)
# Dividimos la cadena con el método .split() convirtiéndola en una lista
cad = cadena_sin_puntuacion.lower().split()
# Creamos una lista vacía
emails = []
for correo in cad:
try:
if "@" in correo:
# Almacenamos el índice de la arroba
indice_arroba = correo.index("@")
# Se produce una excepción si hay más de una arroba e el email
if correo.count("@") > 1:
raise ValueError("Hay más de una arroba en el e-mail: " + correo)
# eliminamos los espacios en blanco del correo
correo_limpio = correo.replace(" ", "")
# si hay un punto después de la arroba dividimos el correo en nombre (antes de la arroba) y dominio (después de la arroba)
if "." in correo_limpio[indice_arroba +1:]:
nombre, dominio = correo.split("@")
# si tiene dos o más caracteres, el dominio es válido. Quitamos los espacios que puedan haber en el dominio
# y añadimos el correo (tupla) en la lista 'emails'
if len(dominio.split(".")[-1]) > 1:
dominio_limpio = dominio.replace(" ", "")
emails.append((nombre, dominio_limpio))
else:
print(f"El dominio del e-mail '{correo}' no es válido")
else:
print("No has introducido un dominio en el e-mail :", correo)
# Se muestra la excepción en caso de haber más de una arroba
except ValueError as e:
print(e)
# Si no hay correos en la lista...
if len(emails) == 0:
print("No se encontraron correos electrónicos en la cadena.")
else:
# Recorremos la lista y mostramos todos los emails en caso de tener nombre de usuario..,
for email in emails:
if email[0]:
print(f"{email[0]}@{email[1]}")
# de lo contrario se muestra el texto con el nombre del dominio en cuestión
else:
print("No existe un nombre de usuario en :", email[1])
except:
print("Ha ocurrido un error inesperado al procesar la cadena.")
Con expresiones regulares utilizando el módulo 're'. En este ejemplo se muestran los correos de la cadena de texto que incluyan los dominios 'hotmail', 'gmail' y 'outlook' :
import re
cadena = "esta es la primera dirección victor@gmail.com, la segunda antonio@hotmail.com, y la tercera:juan@hotmail.com"
# Expresión regular con los dominios permitidos y dos grupos de captura (aquí utilizamos los paréntesis para la captura de los usuarios y los dominios.
#'\.[A-Za-z]{2,}' busca una cadena que comience con un punto (.) seguido de dos o más caracteres alfabéticos.
expresion_regular = r"([a-zA-Z0-9._%+-]+)@(hotmail|gmail|outlook)\.[A-Za-z]{2,}"
# Buscamos correos electrónicos que coincidad con la expresión regular. Se devolverá una lista de tuplas, donde cada una tiene el nombre de usuario
# y el dominio de un correo electrónico que coincide con la expresión regular.
emails = re.findall(expresion_regular, cadena)
# Mostramos los correos electrónicos encontrados.
for email in emails:
print(f"{email[0]}@{email[1]}.com")
0 Reviews