J'ai une variable JSON comme celle-ci:

json_file = {

 "Line 1": [
    {"HFGR62"},
    {"K6RTFV"},
    {"86G37F"}
 ],

 "Line 2": [
    {"FG3RH5"},
    {"45H4H4"},
    {"H4HTH5"}
 ]

}

Et une chaîne qui ressemble à ceci:

string = "{Line 3} Bla bla bla <F3465> <G46H6> bla bla bla <4H6HH> bla <4TH56> bla bla <G4H65>"

Je dois d'abord extraire le texte "Ligne 3" et l'ajouter comme clé à json_file ci-dessus, après cela je dois trouver tous les chiffres / lettres à l'intérieur de "<>" et les ajouter en tant que valeurs.

J'ai essayé ce qui suit:

line = re.match('{(.+?)}', string)
json_file[line.group(1)] = json_file

brackets = re.findall('<(.+?)>', string)
for element in brackets:
   json_file[line.group(1)] = ({element})

Le script ajoute une nouvelle clé, mais seulement la dernière ...

Des idées?

-1
Lavonen 4 juin 2020 à 01:02

4 réponses

Meilleure réponse

Solution

Utilisez les bibliothèques regex (expression régulière) + json pour corriger le fichier json mal formaté.

Le fichier json n'est pas correctement structuré en json. Ainsi, la solution la plus simple sera de remplacer chaque {"ABCXYZ"} par {"ABCXYZ": null}. Cela vous permettra de le lire en tant que fichier json en utilisant la bibliothèque json comme indiqué ci-dessous.

Nous utilisons re.sub() pour remplacer toutes ces occurrences dans votre fichier json.

Remarque : je n'ai pas changé la structure d'un list of {<something>} à un list of <something> juste pour éviter le scénario, si vous avez une entrée où c'est comme {<something>: <somevalue>}.

import re # regex
import json
ss = re.sub(r'{(".*?")}', r'{\1: null}', s)
print(ss)
# Load as json
d = json.loads(ss)
print(d)

Sortie :

## print(ss)
{

 "Line 1": [
    {"HFGR62": null},
    {"K6RTFV": null},
    {"86G37F": null}
 ],

 "Line 2": [
    {"FG3RH5": null},
    {"45H4H4": null},
    {"H4HTH5": null}
 ]

}

## print(d)

{'Line 1': [{'HFGR62': None}, {'K6RTFV': None}, {'86G37F': None}],
 'Line 2': [{'FG3RH5': None}, {'45H4H4': None}, {'H4HTH5': None}]}
0
CypherX 3 juin 2020 à 22:23

set() n'est pas de type JSON valide, utilisez plutôt une chaîne simple:

string = "{Line 3} Bla bla bla <F3465> <G46H6> bla bla bla <4H6HH> bla <4TH56> bla bla <G4H65>"

current_key = ''
for k, v in re.findall(r'{(.*?)}|<(.*?)>', string):
    if k:
        json_file[k] = []
        current_key = k
    else:
        json_file[current_key].append(v)

import json
print(json.dumps(json_file, indent=4))

Tirages:

{
    "Line 1": [
        "HFGR62",
        "K6RTFV",
        "86G37F"
    ],
    "Line 2": [
        "FG3RH5",
        "45H4H4",
        "H4HTH5"
    ],
    "Line 3": [
        "F3465",
        "G46H6",
        "4H6HH",
        "4TH56",
        "G4H65"
    ]
}
1
Andrej Kesely 3 juin 2020 à 22:19

Utilisez re.findall ('RegexString', variable)

>>> string = "{Line 3} Bla bla bla <F3465> <G46H6> bla bla bla <4H6HH> bla <4TH56> bla 
bla <G4H65> {Line 2}"
>>> import re
>>> line = re.findall('{(.+?)}', string)
>>> print(line)
['Line 3', 'Line 2']
>>> lineTemp = re.match('{(.+?)}', string)
>>> print(lineTemp.groups())
('Line 3',)
>>> 

La fonction re.match () recherche le modèle d'expression régulière et renvoie la première occurrence. Cette méthode recherche une correspondance uniquement au début de la chaîne. Ainsi, si une correspondance est trouvée dans la première ligne, elle renvoie l'objet de correspondance. Mais si une correspondance est trouvée dans une autre ligne, elle renvoie null.

0
kshitiz saini 3 juin 2020 à 22:23

Essaye ça:

line = re.match('{(.+?)}', string)
#json_file[line.group(1)] = json_file COMMENT/DELETE THIS LINE!!!

brackets = re.findall('<(.+?)>', string)
for element in brackets:
    if line.group(1) in json_file:
        json_file[line.group(1)].append({element})
    else:
        json_file[line.group(1)] = [{element}]
0
James Shapiro 3 juin 2020 à 22:16