Python - parser sul testo multilinea

voti
0

il mio obiettivo è quello di creare un parser di testo per i file che contiene i dati multilinee:

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

ogni file contengono set multiplo di tali informazioni. Il mio obiettivo è quello di trovare ogni conneted con successo l'indirizzo IP, seguito dal dettaglio HOST, fino LF.

Nel caso citato un match valido dovrebbe essere IP 92.223.97.22 prod7.team.cn HOST

Posso facilmente trovare il IP utilizzando un'espressione regolare, ma non capisco come creare un match valido, saltando ulteriori linee fino a host.

È pubblicato 10/10/2019 alle 00:53
fonte dall'utente
In altre lingue...                            


2 risposte

voti
0

Sono stato in grado di risolvere utilizzando Regex nidificato:

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, [])
Risposto il 10/10/2019 a 15:38
fonte dall'utente

voti
0

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

Si desidera eseguire il regex in modalità MULTILINE che dovrebbe permettere di adattare su interruzioni di riga. Allora si potrebbe usare qualcosa di simile .*per catturare l'in-between.

Un avvertimento da notare è che si dovrebbe essere sicuri di controllare per un sicuri di non incorrere in un nuovo inizio corrispondente. Come CA.*Bsarebbe partita sia CAB e CACB e CACAB. Quindi molto probabilmente voler controllare in modo esplicito nella vostra regex per non invasa l'inizio di una partita valida con il .*.

Risposto il 10/10/2019 a 01:07
fonte dall'utente

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