Comptez le nombre total d'adresses e-mail valides dans un fichier.

Exemple de fichier Entrée:

Hello from me
@gmail.com
how are you doing?
abc@gmail.com will meet xyz@yahoo.com pq@yahoo.co.in about the meeting 
sharp @2PM.okay see you  yes@yahoo.co.in there.

Sortie attendue: 4

J'ai essayé d'utiliser ce code. mais il renvoie une liste vide.

import re
with open("/Downloads/email.txt",'r') as e_add:
    for lst in e_add:
        lst = re.findall(r'[\w\.-]+@[\w\.-]+',lst)
        print(lst)


Production:

[]
[]
[]
['abc@gmail.com', 'xyz@yahoo.com', 'pq@yahoo.co.in']
['yes@yahoo.co.in']

0
NIMI 24 sept. 2020 à 02:09

3 réponses

Meilleure réponse

Le code de l'OP fonctionne ligne par ligne, de sorte que les listes vides indiquent qu'aucun e-mail valide n'a été trouvé sur cette ligne. On peut résoudre ce problème en lisant le fichier entier dans une variable de chaîne et en exécutant l'expression régulière sur cela, ou en comptant la longueur de chaque liste et en mettant à jour un compteur.

Méthode du compteur

import re

n_email_addresses = 0
with open("/Downloads/email.txt",'r') as f
    for line in f:
        emails_found = re.findall(r'[\w\.-]+@[\w\.-]+', line)
        n_email_addresses += len(emails_found)
print(n_email_addresses)

Méthode de lecture du fichier entier

from pathlib import Path
import re

text = Path("/Downloads/email.txt").read_text()
emails = re.findall(r'[\w\.-]+@[\w\.-]+', text)
n_email_addresses = len(emails)
print(n_email_addresses)
0
jakub 23 sept. 2020 à 23:16
import re
valid_email_count = 0
with open("/Downloads/email.txt",'r') as e_add:
    for lst in e_add:
        lst = re.findall(r'[\w\.-]+@[\w\.-]+',lst)
        valid_email_count += len(lst)

print(valid_email_count)

Le code du moment ajoute également .in à deux des e-mails. Si vous savez que chaque domaine de messagerie n'aura qu'un seul ., vous pouvez modifier l'expression regex en [\w\.-]+@[\w-]+.[\w-]+.

0
etastepe 23 sept. 2020 à 23:29

Ont essayé de mettre la valeur de retour comme ceci:

import re
def n_valid_emails():
    nmails = []
    with open("/Downloads/email.txt",'r') as e_add:
        for lst in e_add:
            lst = re.findall(r'[\w\.-]+@[\w\.-]+',lst)
            nmails += lst
    return len(nmails)

Dans une autre ligne:

print(n_valid_emails())
0
ray 23 sept. 2020 à 23:19