Seite 1 von 1
re.sub mit JSON key und ohne verwenden
Verfasst: Mittwoch 30. September 2020, 11:48
von Shalomi11
Hi Leute,
ich möchte gerne mit
re.sub ein regex finden und durch ein String ersetzten. Das funktioniert auch so weit. Allerdings nur wenn ich meinen ganzen JSON rein gebe.
Ich möchte nämlich in der Lage sein, den ganzen Datensatz oder nur einen Teil der JSON zu betrachten. z.B data["title"] und mein gefundener regex in data["state"] soll in diesem Beispiel nicht replaced werden.
Ich habe meinen Code hier eingefügt:
https://ideone.com/kbAcPq
Ich hoffe es gibt eine Lösung dafür, ich habe es leider nicht hinbekommen
Danke schon mal
Re: re.sub mit JSON key und ohne verwenden
Verfasst: Mittwoch 30. September 2020, 14:24
von __blackjack__
Hier mal der Code damit man nicht irgendwelchen Links folgen muss:
Code: Alles auswählen
# your code goes here
import re
import json
text ={"id": 5931,"iid": 4145,"project_id": 57,"title": "Change: SELAP-3333, SFCAP-3139","state": "opened SELAP-3333","created_at": "2020-09-24T15:04:05.728+02:00","updated_at": "2020-09-24T15:04:09.903+02:00","author": {"username": "veeti"}}
data = json.dumps(text)
change_id_regex = re.compile(r"""([A-Z][A-Z0-9]+-[0-9]+)""")
#replaced_json = re.sub(change_id_regex, "test", data["title"])
replaced_json = re.sub(change_id_regex, "test", data)
print( replaced_json )# your code goes here
`text` ist als Name für ein Wörterbuch nicht wirklich ein passender Name und eine Datenstruktur erst in eine Zeichenkette die ja keine Struktur mehr hat, wenn man nur einen Teil der ursprünglichen Datenstruktur verändern will ist schon mal der erste falsche Schritt.
`data` ist dagegen dann kein guter Name für eine Zeichenkette. Die Namen wären vertauscht genau richtig.
Wenn Du nur den Wert von ``data["title"]`` ändern willst, dann ändere halt den Wert von ``data["title"]``. Das ist eine Kombination aus grundlegenden Operationen. Wert aus über Schlüssel aus Wörterbuch abfragen. Neuen, veränderten Wert erstellen. Den neuen Wert über den Schlüssel wieder in das Wörterbuch eintragen. Das kann man in drei Schritten machen, aber auch problemlos in einer Anweisung zusammenfassen.
Re: re.sub mit JSON key und ohne verwenden
Verfasst: Donnerstag 1. Oktober 2020, 06:14
von Shalomi11
Hättest du einen Vorschlag wie ich das umsetzten kann? Ich muss so automatisiert wie möglich machen und die Tatsache dass ich zwei Optionen haben kann also mit "key" und ohne, verwirrt mich sehr.
Re: re.sub mit JSON key und ohne verwenden
Verfasst: Donnerstag 1. Oktober 2020, 06:38
von Sirius3
Was mußt Du denn konkret machen? Was ist Dein Input, wie soll der Output aussehen? Nach welchen Regeln soll etwas ersetzt werden?
Re: re.sub mit JSON key und ohne verwenden
Verfasst: Donnerstag 1. Oktober 2020, 06:50
von Shalomi11
Also meine Inputs sind merge requests von GitLab mit Hilfe der GitLab API:
https://docs.gitlab.com/ee/api/merge_re ... -single-mr
Die hole ich quasi rein und speicher sie ab. Anschließend habe ich einen Parser der bestimmte sachen machen kann. ein Regex finden, regex finden und ersetzten. In dem Fall schauen wir uns den Teil an, mit regex finden und ersetzten. Dies soll als JSON format neu abgespeichert zurück geben also quasi neue Liste oder so.
Ich habe allerdings den Fall, dass ich teilweise nicht den ganzen merge request als data angebe zum suchen sondern zum beispiel nur den teil wo key == title ist. Oder eben den ganzen Datensatz und das macht mir auch etwas probleme hierbei.
Re: re.sub mit JSON key und ohne verwenden
Verfasst: Donnerstag 1. Oktober 2020, 08:27
von Sirius3
Du hast erst einmal einen JSON-Parser. Alles andere macht keinen Sinn. Dann hast Du eine Datenstruktur, in der Du etwas suchen kannst. Entweder bestimmte Werte, oder bestimmte Schlüssel oder bestimmte Werte in bestimmten Schlüsseln.
Wie sehen also konkret Deine Suchanfragen aus?
Re: re.sub mit JSON key und ohne verwenden
Verfasst: Donnerstag 1. Oktober 2020, 08:32
von Shalomi11
so wie in dem Code: da habe ich mit meinem regex nach Scrum tickets Format gesucht
Re: re.sub mit JSON key und ohne verwenden
Verfasst: Donnerstag 1. Oktober 2020, 08:56
von sparrow
@Shalomi11: Und wo ist dein Problem einfach die Datenstruktur zu verwenden? Wenn du den Wert von data["tilte"] ändern möchtest, dann änder ihn doch einfach, indem du auf den Wert zugreifst?!?
Re: re.sub mit JSON key und ohne verwenden
Verfasst: Donnerstag 1. Oktober 2020, 09:25
von Shalomi11
Ich kann aber nicht data mit egeben oder data["title"] weil es kein dict ist. Du kannst auf den Link und es ausprobieren. Ich hatte den Teil auskommentiert
Re: re.sub mit JSON key und ohne verwenden
Verfasst: Donnerstag 1. Oktober 2020, 09:38
von Jankie
Du möchtest also bei:
Code: Alles auswählen
{"id": 5931,"iid": 4145,"project_id": 57,"title": "Change: SELAP-3333, SFCAP-3139","state": "opened SELAP-3333","created_at": "2020-09-24T15:04:05.728+02:00","updated_at": "2020-09-24T15:04:09.903+02:00","author": {"username": "veeti"}}
Nur den title ändern und das Ergebnis gerne als json String haben?
Also dass folgendes herauskommt:
Code: Alles auswählen
{"id": 5931, "iid": 4145, "project_id": 57, "title": "Change: test, test", "state": "opened SELAP-3333", "created_at": "2020-09-24T15:04:05.728+02:00", "updated_at": "2020-09-24T15:04:09.903+02:00", "author": {"username":"veeti"}}
Re: re.sub mit JSON key und ohne verwenden
Verfasst: Donnerstag 1. Oktober 2020, 09:43
von Shalomi11
Genau so und manchmal kommt es vor, dass im gesamten datensatz dieses gefundene regex ändern muss. Wie machst du das jetzt?
Re: re.sub mit JSON key und ohne verwenden
Verfasst: Donnerstag 1. Oktober 2020, 09:44
von Jankie
Code: Alles auswählen
import re
import json
data ={"id": 5931,"iid": 4145,"project_id": 57,"title": "Change: SELAP-3333, SFCAP-3139","state": "opened SELAP-3333","created_at": "2020-09-24T15:04:05.728+02:00","updated_at": "2020-09-24T15:04:09.903+02:00","author": {"username": "veeti"}}
change_id_regex = re.compile("([A-Z][A-Z0-9]+-[0-9]+)")
data["title"] = re.sub(change_id_regex, "test", data["title"])
json_text = json.dumps(data)
print(json_text)
Re: re.sub mit JSON key und ohne verwenden
Verfasst: Donnerstag 1. Oktober 2020, 11:42
von sparrow
@Shalomi11: Aber data _ist_ doch ein dict. Und das was da in deinem Link erklärt wird ist JSON, und das ist nach dem parsen ebenfalls ein dict. So wie Jankie zeigt.