Python - analisador sobre o texto de várias linhas

votos
0

meu objetivo é criar um analisador de texto para arquivos contendo dados multilines:

Applying option loglevel (set logging level) with argument debug.
Successfully parsed a group of options.
Parsing a group of options: input url http://prod7.team.cn/test/tracks-v1a1/mono.
Successfully parsed a group of options.
Opening an input file: http://prod7.team.cn/test/tracks-v1a1/mono
[NULL @ 000001e002039000] Opening 'http://prod7.team.cn/test/tracks-v1a1/mono' for reading
[http @ 000001e00203a040] Setting default whitelist 'http,https,tls,rtp,tcp,udp,crypto,httpproxy'
[tcp @ 000001e00203ba80] Original list of addresses:
[tcp @ 000001e00203ba80] Address 92.223.97.22 port 80
[tcp @ 000001e00203ba80] Interleaved list of addresses:
[tcp @ 000001e00203ba80] Address 92.223.97.22 port 80
[tcp @ 000001e00203ba80] Starting connection attempt to 92.223.97.22 port 80
[tcp @ 000001e00203ba80] Successfully connected to 92.223.97.22 port 80
[http @ 000001e00203a040] request: GET /test/tracks-v1a1/mono HTTP/1.1

User-Agent: Lavf/58.31.101

Accept: */*

Range: bytes=0-

Connection: close

Host: prod7.team.cn

Icy-MetaData: 1

cada arquivos contêm múltiplos conjunto de tais informações. O meu objectivo é encontrar todos os conneted com sucesso endereço IP, seguido pelo detalhe HOST, até LF.

No caso mencionado partida válida deve ser IP 92.223.97.22 prod7.team.cn HOST

Eu posso facilmente encontrar o IP usando um regex, mas eu não entendo como criar partida válida, ignorando outras linhas até host.

Publicado 10/10/2019 em 00:53
fonte usuário
Em outras línguas...                            


2 respostas

votos
0

Eu era capaz de resolver usando Regex aninhada:

ip_list = []
    regex = r'connected(.*?)Host[^\n]+$'
    text_as_string = open('C:\\temp\\log.txt', 'r').read()
    matches = re.finditer(regex, text_as_string, re.DOTALL | re.MULTILINE)
    for matchNum, match in enumerate(matches, start=1):
        block = str(match.group())
        #print connected IP
        ip = re.compile('(connected to).[0-9]+(?:\.[0-9]+){3}.port.*')
        for match in re.finditer(ip, block):
            f_id=match.group()
        #print connected host
        host = re.compile('Host[^\n]+$')
        for match in re.finditer(host, block):
            f_host=match.group()
        if f_id =='':
            f_id='NA'
        if f_host =='':
            f_host='NA'
        ip_list.append([f_id,f_host])
    unique_ip = reduce(lambda l, x: l if x in l else l+[x], ip_list, [])
Respondeu 10/10/2019 em 15:38
fonte usuário

votos
0

https://docs.python.org/3.7/library/re.html#re.MULTILINE

Você deseja executar o seu regex em modo MULTILINE que deverá permitir-lhe para combinar sobre quebras de linha. Em seguida, você poderia usar algo como .*capturar a in-between.

A ressalva a notar é que você deve ter certeza de verificar para ter uma certeza de não correr em um novo começo correspondente. Como CA.*Biria corresponder tanto CAB e CACB e CACAB. Então, provavelmente vai querer verificar explicitamente em seu regex para não saturar o início de uma partida válida com a .*.

Respondeu 10/10/2019 em 01:07
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more