Python - parser ciągu tekstu wielowierszowego

głosy
0

moim celem jest stworzenie parser tekstu dla plików zawierających dane multilinie:

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

każda pliki zawierają wiele zestaw takich informacji. Moim celem jest znalezienie wszelkich „Pomyślnie conneted” adres IP, a następnie szczegółach gospodarz, aż LF.

W przypadku wymienionych ważny mecz powinien być IP 92.223.97.22 prod7.team.cn ŻYWICIELSKICH

Mogę łatwo odnaleźć adres IP za pomocą wyrażenia regularnego, ale nie rozumiem, jak stworzyć poprawny mecz, omijając kolejne linie till „host”.

Utwórz 10/10/2019 o 00:53
źródło użytkownik
W innych językach...                            


2 odpowiedzi

głosy
0

Udało mi się rozwiązać za pomocą zagnieżdżonego wyrażenia regularnego:

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, [])
Odpowiedział 10/10/2019 o 15:38
źródło użytkownik

głosy
0

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

Chcesz uruchomić regex w trybu wielowierszowego, który powinien pozwolić na dopasowanie ponad podziały wiersza. Następnie można użyć coś podobnego .*do przechwytywania pomiędzy.

Zastrzeżenie, aby zauważyć, że należy koniecznie sprawdzić, na pewno nie napotkasz nowy początek dopasowania. Jak CA.*Bbędzie pasować zarówno CAB i CACB i CACAB. Tak najprawdopodobniej będzie chciał jednoznacznie sprawdzić w regex nie opanowane początek ważnego meczu z .*.

Odpowiedział 10/10/2019 o 01:07
źródło użytkownik

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