Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Problème d'expression régulière (débutant)

13 réponses
Avatar
Pierre Bertet
Bonjour,

j'ai un petit problème avec une expression régulière, le texte à parser
est de la forme :


["cle_nom_fixe1"] = {
["cle_nom_imprevisible1"] = {
["cle_nom_fixe3"] = "valeur"
["cle_nom_fixe4"] = 123456
["cle_nom_fixe5"] = "valeur"
["cle_nom_fixe6"] = "valeur"
["cle_nom_fixe7"] = "valeur"
}
["cle_nom_imprevisible2"] = {
["cle_nom_fixe3"] = "valeur"
["cle_nom_fixe4"] = 123456
["cle_nom_fixe5"] = "valeur"
["cle_nom_fixe6"] = "valeur"
["cle_nom_fixe7"] = "valeur"
}
["cle_nom_imprevisible3"] = {
["cle_nom_fixe3"] = "valeur"
["cle_nom_fixe4"] = 123456
["cle_nom_fixe5"] = "valeur"
["cle_nom_fixe6"] = "valeur"
["cle_nom_fixe7"] = "valeur"
}


...


["cle_nom_fixe2"] = {
}
}


Vous l'aurez compris, les valeurs qui m'intéressent sont à l'intérieur
des "cle_nom_imprevisible".


Je commence donc par récupérer la partie qui m'intéresse, de cette façon :

expr1 = re.compile('\["cle_nom_fixe1"\] = {(.*)\["cle_nom_fixe2"\]',re.S)
texte1 = expr1.search(contenu)
texte1 = texte1.group()

puis j'essaie d'isoler chaque "cle_nom_imprevisible", et c'est là que ça
coince :

expr2 = re.compile('\(["cle_nom_fixe3"\].*)\["cle_nom_fixe7"\].*',re.S)
texte2 = expr2.findall(texte1)

(la valeur de "cle_nom_fixe7" ne m'intéresse pas, heureusement!)

Puis :

for i in range(len(texte2)):
print texte2[i]+"\n____________________________\n"

Mais au lieu de s'arrêter à chaque ["cle_nom_fixe7"], il s'arrête à la
dernière, j'ai donc une seule entrée dans texte2 qui est :

["cle_nom_fixe3"] = "valeur"
["cle_nom_fixe4"] = 123456
["cle_nom_fixe5"] = "valeur"
["cle_nom_fixe6"] = "valeur"
["cle_nom_fixe7"] = "valeur"
}
["cle_nom_imprevisible2"] = {
["cle_nom_fixe3"] = "valeur"
["cle_nom_fixe4"] = 123456
["cle_nom_fixe5"] = "valeur"
["cle_nom_fixe6"] = "valeur"
["cle_nom_fixe7"] = "valeur"
}
["cle_nom_imprevisible3"] = {
["cle_nom_fixe3"] = "valeur"
["cle_nom_fixe4"] = 123456
["cle_nom_fixe5"] = "valeur"
["cle_nom_fixe6"] = "valeur"

Ce qui peut me sembler logique, puisque j'utilise .*

Mais alors comment faire?

Merci d'avance pour votre aide.

3 réponses

1 2
Avatar
stephane
Gerard Flanagan wrote:
(snip)

def dict_from_string( data ):
d = ''.join(data.split())
d = '{' + d + '}'
d = d.replace('=',':')
d = d.replace('[',',')
d = d.replace(']','')
d = d.replace('{,','{')
return eval(d) # 'eval' - fais attention!





A part pour un script jetable, c'est une solution plutôt plus à mon goût
... faudrait tester les perfs respectives.

Après, il y a aussi la solution d'écrire un vrai parseur, mais bon, ça
devient peut-être un poil overkill !-)


pyparsing -- an object-oriented approach to text processing in Python

http://pyparsing.sourceforge.net/

Stéphane.


Avatar
Méta-MCI
Bonsoir !

Pyparsing est plutôt fâché avec les accents...

@+

MCI
Avatar
Franssoa
Bonjour,

En marge du sujet, pour s'entraîner aux expressions régulières et les
tester :

Kodos : "The Python Regex Debugger"

http://kodos.sourceforge.net/



Franssoa
1 2