re.sub mit JSON key und ohne verwenden

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
Shalomi11
User
Beiträge: 6
Registriert: Mittwoch 30. September 2020, 11:37

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
Benutzeravatar
__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:

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.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Shalomi11
User
Beiträge: 6
Registriert: Mittwoch 30. September 2020, 11:37

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.
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

Was mußt Du denn konkret machen? Was ist Dein Input, wie soll der Output aussehen? Nach welchen Regeln soll etwas ersetzt werden?
Shalomi11
User
Beiträge: 6
Registriert: Mittwoch 30. September 2020, 11:37

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.
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

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?
Shalomi11
User
Beiträge: 6
Registriert: Mittwoch 30. September 2020, 11:37

so wie in dem Code: da habe ich mit meinem regex nach Scrum tickets Format gesucht
Benutzeravatar
sparrow
User
Beiträge: 4538
Registriert: Freitag 17. April 2009, 10:28

@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?!?
Shalomi11
User
Beiträge: 6
Registriert: Mittwoch 30. September 2020, 11:37

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
Jankie
User
Beiträge: 592
Registriert: Mittwoch 26. September 2018, 14:06

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"}}
Shalomi11
User
Beiträge: 6
Registriert: Mittwoch 30. September 2020, 11:37

Genau so und manchmal kommt es vor, dass im gesamten datensatz dieses gefundene regex ändern muss. Wie machst du das jetzt?
Jankie
User
Beiträge: 592
Registriert: Mittwoch 26. September 2018, 14:06

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

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