Python - satırlı metin üzerinde çözümleyici

oy
0

amacım dosyası içeren multilines veriler için bir metin ayrıştırıcı oluşturmaktır:

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

Her dosyalar tür bilgilerin birden grubu içerir. Benim hedef LF kadar HOST detay ardından her Başarıyla conneted IP adresini, bulmaktır.

durumda geçerli bir maç IP 92.223.97.22 HOST prod7.team.cn olmalıdır sözü

Kolayca bir regex kullanarak IP bulabilirsiniz, ama ev sahibi kadar ilave çizgiler atlayarak, geçerli bir maç nasıl oluşturulacağı anlamıyorum.

Oluştur 10/10/2019 saat 00:53
kaynak kullanıcı
Diğer dillerde...                            


2 cevaplar

oy
0

Ben iç içe Regex kullanarak sıralamak mümkün:

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, [])
Cevap 10/10/2019 saat 15:38
kaynak kullanıcı

oy
0

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

Eğer satır sonları üzerinde maç için izin vermelidir MULTILINE modunda regex çalıştırmak istiyorum. Sonra böyle bir şey kullanabilirsiniz .*arada yakalamak için.

Fark bir uyarı size yeni eşleme başlangıcı içine tüketmemek bir emin olmak için kontrol edin gerektiğidir. Gibi CA.*BCAB'i ve CACB ve CACAB hem eşleşir. Yani büyük olasılıkla açıkça sahip geçerli maçın başlangıcını taşması için regex kontrol etmek isteyeceklerdir .*.

Cevap 10/10/2019 saat 01:07
kaynak kullanıcı

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