Extrahieren Sie die in Klammern '[]' angegebenen Daten aus einer String-Nachricht in python

Ich möchte Felder von unten herausziehen Log Nachricht.

Beispiel:

  • Scrapy versagt im Terminal
  • Csv row import in python array
  • Kann Super mit Mehrfachvererbung umgehen?
  • Bewegen der x-Achse zum Gipfel eines Plots in Matplotlib
  • Trunkieren Sie einen Dezimalwert in Python
  • Einfacher Syntaxfehler in Python, wenn sonst Dict Verständnis
  • Ignorieren des Eintrags, Betroffene Spalten [Spalte1: Spalte2], Grund [irgendein Grund], Details [einige Eintragsdetails]

    Ich muss die in den Klammern angegebenen Daten extrahieren [ ] für "Betroffene Spalten, Grund, Details"

    Was wäre der effiziente Weg, um diese Felder in Python zu extrahieren?

    Hinweis: Ich kann das Log-Nachrichtenformat bei Bedarf ändern.

  • Speicherleck in Python-Erweiterung, wenn Array mit PyArray_SimpleNewFromData () erstellt und zurückgegeben wird
  • Sandboxing / laufende Python-Code Zeile für Zeile
  • Django vieletomany Signale?
  • Verhindern, dass Achsen in der wissenschaftlichen Notation (Befugnisse von 10) mit Matplotlib in Python auf Semilogie-Handlung
  • Headers = {"authorization": "bearer" + accessToken ['access_token'], "User-Agent": userAgent} KeyError: 'access_token'
  • Was ist der einfachste Weg, um für Python 3 auf Debian zu mechanisieren?
  • One Solution collect form web for “Extrahieren Sie die in Klammern '[]' angegebenen Daten aus einer String-Nachricht in python”

    Wenn Sie frei sind, das Log-Format zu ändern, ist es am einfachsten, ein gemeinsames Datenformat zu verwenden – ich würde JSON für solche Daten empfehlen. Es ist strukturiert, aber leicht genug, um es sogar aus benutzerdefinierten bash scripts zu schreiben. Das json Modul ermöglicht es Ihnen, es direkt in native Python-Objekte umzuwandeln:

     import json # python has a default parser # assume this is your log message log_line = '{"Ignoring entry" : {"Affected columns": [1, 3], "reason" : "some reason", "Details": {}}}' data = json.loads(log_line) print("Columns to ignore:", data["Ignoring entry"]["Affected columns"]) 

    Wenn du mit dem aktuellen Format arbeiten möchtest, musst du mit str Methoden oder dem re Modul arbeiten.

    Zum Beispiel könntest du das tun:

     log_msg = "Ignoring entry, Affected columns [column1:column2], reason[some reason], Details[some entry details]" def parse_log_line(log_line): if log_line.startswith("Ignoring entry"): log_data = { for element in log_line.split(',')[1:]: # parse all elements but the header key, value = element.partition('[') if value[-1] != ']': raise ValueError('Malformed Content. Expected %r to end with "]"' % element) value = value[:-1] log_data[key] = value return log_data raise ValueError('Unrecognized log line type') 

    Viele Parsing-Aufgaben werden am besten kompakt von der re Modul behandelt . Es erlaubt Ihnen, reguläre Ausdrücke zu verwenden. Sie sind sehr mächtig, aber schwer zu pflegen, wenn man es nicht gewohnt ist. In Ihrem Fall würde das folgende funktionieren:

     log_data = {key: value for key, value in re.findall(',\s?(.+?)\s?\[(.+?)\]', log_line)} 

    So funktioniert das:

    • , Ein wörtliches Komma, das Ihre Einträge trennt
    • \s* eine beliebige Folge von Whitespace nach dem Komma, vor dem nächsten Element
    • (.+?) Alle Nicht-Whitespace-Zeichen (der Schlüssel, erfasst über '()' )
    • \s* eine beliebige Folge von Whitespace zwischen Schlüssel und Wert
    • \[ Ein wörtlicher [
    • (.+?) Die kürzeste Folge von Nicht-Whitespace-Zeichen vor dem nächsten Element (der Wert, der über '()' erfasst wird)
    • Ein wörtlicher

    Die Symbole * , + und ? Bedeutet "irgendwelche", "mehr als eins" und "so wenig wie möglich".

    Python ist die beste Programmiersprache der Welt.