String zurechtstutzen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Brando
User
Beiträge: 171
Registriert: Donnerstag 28. Januar 2016, 15:36

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!
Benutzeravatar
sparrow
User
Beiträge: 4538
Registriert: Freitag 17. April 2009, 10:28

Du weißt, was die eckigen Klammern bedeuten? Das ist die Notation einer Liste. Das ist das, was findall zurück gibt.
Brando
User
Beiträge: 171
Registriert: Donnerstag 28. Januar 2016, 15:36

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?
Benutzeravatar
sparrow
User
Beiträge: 4538
Registriert: Freitag 17. April 2009, 10:28

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.
Antworten