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.sub mit JSON key und ohne verwenden
- __blackjack__
- User
- Beiträge: 14052
- Registriert: Samstag 2. Juni 2018, 10:21
- Wohnort: 127.0.0.1
- Kontaktdaten:
Hier mal der Code damit man nicht irgendwelchen Links folgen muss:
`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.
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
`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.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
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.
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.
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?
Wie sehen also konkret Deine Suchanfragen aus?
Du möchtest also bei:
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: 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"}}
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"}}
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)