Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Ajuda para parsear dados

Galera estou com o seguinte problema e gostaria de ajuda para transformar um arquivo de logs em um dicionario de chave e valor para uso posterior mais estou empacado quanto ao código.

default: T (add header): [10.78/15.00] [SURBL_VERYBAD(5.00){test.abuse.dnsbl;},HTML_SHORT_LINK_IMG_1(2.00){},IP_SCORE(1.99){ip: (1.56), ipnet: 123.245.3.34/19(2.57), asn: 12876(2.45), country: FR(0.06);},HAS_INTERSPIRE_SIG(1.00){},MID_RHS_WWW(0.50){},MIME_HTML_ONLY(0.20){},BAD_REP_POLICIES(0.10){},HAS_LIST_UNSUB(-0.01){},ARC_NA(0.00){},ASN(0.00){asn:12876, ipnet:123.245.3.34/19, ipnet:123.245.3.34/19, country:FR;},DKIM_TRACE(0.00){test.com:+;},DMARC_POLICY_ALLOW(0.00){teste.com;none;},FROM_EQ_ENVFROM(0.00){},FROM_HAS_DN(0.00){},HAS_REPLYTO(0.00){producao@test.com;},MIME_TRACE(0.00){0:~;},PREVIOUSLY_DELIVERED(0.00){teste@teste.com;},RCPT_COUNT_ONE(0.00){1;},RCVD_COUNT_TWO(0.00){2;},RCVD_TLS_LAST(0.00){},REPLYTO_ADDR_EQ_FROM(0.00){},R_DKIM_ALLOW(0.00){test.com:s=dkim;},R_SPF_ALLOW(0.00){+ptr;},TO_DN_NONE(0.00){},TO_MATCH_ENVRCPT_ALL(0.00){}])

E gostaria que ficasse formatado como um dicionário da seguinte maneira:

{"default: T (add header)": "10.78/15.00",
"SURBL_VERYBAD": "5.00",
"HTML_SHORT_LINK_IMG_1": "2.00",
"IP_SCORE": "1.99",
"ip": "1.56",
"ipnet: 123.245.3.34/19": "2.57",
"asn": "2.45",
"country": "FR",
"HAS_INTERSPIRE_SIG": "1.00",
"MID_RHS_WWW": "0.50",
"MIME_HTML_ONLY": "0.20",
"BAD_REP_POLICIES": "0.10",
"HAS_LIST_UNSUB": "-0.01",
"ARC_NA": "0.00",
"DMARC_POLICY_ALLOW": "0.00",
"FROM_EQ_ENVFROM": "0.00",
"HAS_REPLYTO": "5.00"
}

Lembrando que usarei um arquivo com varias linhas parecidas com esta para transformar em dicionario.

Este é meu código até agora:

import re

pontuacao = '(\[-?\d*\.\d*\/)'
status = '(\:\s.\s\(.*\)\:\s)'
_id = '(\w{3}\:\s<\w*>,\s\w{2}:)'

with open('logs.txt', 'r') as lines:
    line = str(lines.read())

# get only the score
print(re.findall(pontuacao, line)[0].strip('[').strip('/'))
# get action
print(re.findall(status, line)[0].split('(')[1].strip('): '))
# get id
print(re.findall(_id, line)[0].split('<')[1].split('>')[0])

Mais estou empacado ai! Será que alguém consegue me ajudar nisto?

1 resposta
solução!

Resolvido