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")

  • Comparte:

Puede que también te guste

0 Reviews

Vuelve arriba