Извлекать и подсчитывать адреса доменов из писем - PullRequest
0 голосов
/ 06 июля 2018

У меня есть список электронных писем, и я хотел бы извлечь только домены и посчитать, сколько раз каждое из них появляется:

Электронная почта:

best@yahoo.com

hello@gmail.com

everybody@gmail.com

bye@gmail.com

day@yahoo.com

table.blue@gmail.com

life@yahoo.com

Сценарий:

import re
from collections import Counter

with open("mails.txt", "r") as f:
    texte = f.read().split('\n')

    for line in texte:
        newline = re.search("@[\w.]+", line)
        newmail = newline.group()

        mails_value = Counter(newmail).most_common()

        print (mails_value)

выход:

[('@', 1), ('g', 1), ('6', 1), ('5', 1), ('.', 1), ('f', 1 ), ('r', 1)]

Traceback (последний вызов был последним):

Файл "counting.py", строка 10, в

newmail = newline.group()

AttributeError: объект 'NoneType' не имеет атрибута 'group'

хороший вывод:

@yahoo.com 3

@gmail.com 4

Ответы [ 6 ]

0 голосов
/ 06 июля 2018
import re
from collections import Counter

mails = []

with open("mails.txt", "r") as f:
    texte = f.read().split()
    for i in texte:
        mails.append(re.search("@[\w.]+", i).group())

mails_value = Counter(mails).most_common()
print mails_value
0 голосов
/ 06 июля 2018

Регулярное выражение спасет вас от создания ненужного списка.

import re
from collections import Counter

with open("mails.txt", "r") as f:
    texte = f.read().split('\n')
    l=[]
    for line in texte:
        p=re.compile("(?<=@)[^.]+(?=\.)")
        newline = p.search(line)
        if(newline):

            newmail = newline.group(0)
            l.append(newmail)

Counter(l)

OUTPUT

Counter({'gmail': 4, 'yahoo': 3})
0 голосов
/ 06 июля 2018

Вам не нужно регулярное выражение. Если вы можете верить, что все входные данные являются правильно сформированными электронными письмами, этого должно быть достаточно:

from collections import defaultdict

domain_count = defaultdict(lambda: 0)

with open("mails.txt", "r") as f:
    texte = f.readlines()

    for line in texte:
        domain = line.split('@')[-1]
        domain_count[domain] += 1

print (domain_count)
0 голосов
/ 06 июля 2018

сделать 2 раскола. Второй с @ .. Затем добавьте последний элемент и примените счетчик к списку

import re
from collections import Counter

with open("mails.txt", "r") as f:
    texte = f.read().split('\n')

    domains = []

    for line in texte:
        line = line.split('@')
        if line[-1] != "":
            domains.append(line[-1])

mails_value = Counter(domains).most_common()

print(mails_value)   

[('gmail.com', 4), ('yahoo.com', 3)]

0 голосов
/ 06 июля 2018

Вы довольно близки - не нужно разбивать файл на строки, просто используйте re.findall, re.MULTILINE и шаблон @(.*)$

import re
import collections

with open("mails.txt") as f:
    text = f.read()
domains = re.findall(r'@(.*)$', text, re.MULTILINE)
mails_value = collections.Counter(domains) 
# outputs with example: Counter({'gmail.com': 4, 'yahoo.com': 3})
0 голосов
/ 06 июля 2018

вы можете использовать сплит

texte = "life@yahoo.com"
texte.split("@")
['life', 'yahoo.com']
...