Seite 1 von 1

String zurechtstutzen

Verfasst: Samstag 10. Juli 2021, 18:58
von Brando
Hallo, folgende Funktion berechnet aus einer Textdatei einzelne Items pro Zeile, wobei hier für die erste Zeile codiert wurde:

Code: Alles auswählen

import re
def logs():
    with open("assets/logdata.txt", "r") as file:
        # log_data = file.read()
        in_line = file.readline()
        print (in_line)
        host, rest = in_line.split(" - ")
        user_name = re.search(r"[a-z]*[0-9]*", rest)
        user_name = user_name.group()
        time = re.findall(r'(\[.*\])', rest)
        # time = time[1:-1]
        request = re.findall(r'(\".*\s.*\")', rest)
        print (request)
        print(time)
        print(host)
        print (user_name)
        # one_item = {'host': host, 'user_name': user_name, 'time': time, 'request': request}
        one_item = {'host': host, "user_name": user_name, 'time': time, 'request': request}
        print (one_item)
        return one_item
        
    
        
    raise NotImplementedError()
Das Problem damit ist, dass ich folgende Ausgabe erhalte:

['"POST /incentivize HTTP/1.1"']
['[21/Jun/2019:15:45:24 -0700]']
146.204.224.152
feest6811
{'host': '146.204.224.152', 'user_name': 'feest6811', 'time': ['[21/Jun/2019:15:45:24 -0700]'], 'request': ['"POST /incentivize HTTP/1.1"']}

Aber gefordert ist:
example_dict = {"host":"146.204.224.152",
"user_name":"feest6811",
"time":"21/Jun/2019:15:45:24 -0700",
"request":"POST /incentivize HTTP/1.1"}

Wichtig ist hier nicht, dass ich noch nicht example_dict codiert habe, sondern die einzelnen Einträge. Die haben hier nur ein Anführungszeichen, während meine geklammert ua ist. Wie kann ich das überwinden? Eine Funktion time= time[1,-1] funktioniert nicht, liefert nur einen leeren Eintrag wieder!

Re: String zurechtstutzen

Verfasst: Samstag 10. Juli 2021, 19:06
von sparrow
Du weißt, was die eckigen Klammern bedeuten? Das ist die Notation einer Liste. Das ist das, was findall zurück gibt.

Re: String zurechtstutzen

Verfasst: Samstag 10. Juli 2021, 20:04
von Brando
Vergleiche einmal mein Datum mit den Klammern [] und das geforderte Datum ohne diese! Wie kann ich das erzeugen? Im Text ist der Eintrag geklammert, und danach suche ich. Dann kommt noch die Klammer eines Listeneintrags dazu. Beide Klammern will ich beseitigen!? Wie gehe ich vor?

Re: String zurechtstutzen

Verfasst: Samstag 10. Juli 2021, 20:46
von sparrow
Nochmal: "findall" gibt dir eh immer eine Liste zurück.

Sind die Log-Einträge, die du suchst, immer vom selben Format? Anstatt für jede Variable eine Regular Expression zu schreiben, brauchst du eine Expression für die Zeile und holst dir dort über Gruppen heraus, was du haben möchtest.