Python - parser nad víceřádkového textu

hlasů
0

mým cílem je vytvořit textový parser pro multilines souborových dat, které obsahuje:

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ždá soubory obsahují více sadu takových informací. Mým cílem je najít všechny „úspěšně conneted“ IP adresa, po němž následuje detailu hostitele, do LF.

V případě zmíněné platné shoda by měla být IP 92.223.97.22 HOST prod7.team.cn

Mohu snadno najít IP pomocí regulárních výrazů, ale nechápu, jak vytvořit platný zápas, skákání další řádky, dokud „host“.

Položena 10/10/2019 v 00:53
zdroj uživatelem
V jiných jazycích...                            


2 odpovědí

hlasů
0

Byl jsem schopen vyřešit pomocí vnořeného Regex:

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, [])
Odpovězeno 10/10/2019 v 15:38
zdroj uživatelem

hlasů
0

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

Chcete-li spustit regulární výraz v režimu MultiLine, které by vám mělo umožnit, aby odpovídaly v průběhu řádků. Pak byste mohli použít něco jako .*zachytit mezi tím.

Námitka ke zprávě je, že byste měli být jisti, kontrolovat, aby se ujistil, nemusíte narazit na nový začátek odpovídající. Stejně jako CA.*Bby odpovídal i CAB a CACB a CACAB. Takže s největší pravděpodobností bude chtít explicitně zkontrolovat ve své regex, že nebude překročen počátek platného utkání s .*.

Odpovězeno 10/10/2019 v 01:07
zdroj uživatelem

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