mr-ZA
@mr-ZA

Регулярки в python?

Всем привет, обращаюсь потому что уже все мозги сломал, думаю весь день. В общем есть файл(log.txt) следующего содержания:
https://dropmefiles.com/nDxU0

Задача в том, чтобы:
1) Спарсить файл и найти e-mail адреса, в коде (mail_unfiltered = [])
2) Отфильтровать список на похожие, в коде (mail_list = [])
3) После подсчитать сколько раз определенное мыло отправляло сообщения и вывести в файл результата {мыло:сколько раз отправляло сообщение}

(В коде функция def parse_key(key) которую я не осилил) соответственно решено было просто передать в функцию мыло из фильтрованного списка ( mail_list[] ) по очереди и при сравнении с значением в нефильтрованном списке ( mail_unfiltered[] ) прибавлять счетчик количества на +1 но как это оформить я запутался, помогите, как записать именно функцию def parse_key? Остальной код пусть остается как есть. Пока в питоне плохо разбираюсь, код ниже, спасибо!

import os
import re
import numpy as np

def mkdir_cmd():
    if not os.path.exists(r".\results"):
        os.mkdir(r".\results")
        print(r'Dir made')

def parse_key(key):                                 #считаем сколько раз отправлял письма почтовый ящик из списка
    global mail_unfiltered
    mail_unfiltered_local = mail_unfiltered
    found_list = []
    count = 0

    for val in mail_unfiltered_local:

        if (val == key):
            found_list.append(val)
            count += 1                  #если встретили такое мыло увеличиваем счетчик отправок

    return found_list

def filter_list(list):
    new = []
    for i in list:
        if i not in new:        #availability in list <new[]> check
            new.append(i)
    return new

def get_data():
    global mail_list
    global mail_unfiltered
    #search for patterns
    countMail = 0
    countMessages = 0
    countSuccess = 0
    countError = 0
    i=0

    with open("maillog", "r") as file_read:

        for text in file_read:
            mail = re.findall(r'(from=<[a-z]+@+[a-z]+.\w\w>)', text)

            if (mail):
                mail_list.append(mail)
                mail_unfiltered.append(mail)
                print(mail)

    mail_list = filter_list(mail_list)      #filtering list on repeats
    print("\n" + "Filtered list: ")
    print(mail_list)

    print("\n" + "UnFiltered list: ")
    print(mail_unfiltered)
    print("\n")

    print("Length of filtered values in list: ")
    print(len(mail_list))
    print("\n")

    print("Length of unfiltered values in list: ")
    print(len(mail_unfiltered))
    print("\n")

    while i < len(mail_list):               # здесь надо спарсить нефильтрованный список и посчитать сколько раз e-mail отправлял письма
        str1 = ''.join(mail_list[i])
        print (parse_key(str1))
        i =+ 1

def main():
    mkdir_cmd()
    get_data()

mail_list = []                               # глобальная переменная, хранит список мыл без повторений
mail_unfiltered = []                         # глобальная переменная, хранит спарсенные повторяющиеся e-mail'ы

if __name__ == '__main__':
    main()
  • Вопрос задан
  • 168 просмотров
Решения вопроса 1
longclaps
@longclaps
import re
from collections import Counter

with open('maillog', 'r') as fi:
    for m, n in Counter(re.findall(r'(?<=\bfrom=<)[^>]+', fi.read(),
                                   flags=re.M)).most_common():
        print(f'{m:32}{n:>3}')
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы