Forum Clubic

Comment rechercher et remplacer sous python avec nombre dans balise avec expression régulière mathématique?

Résolu voir mon message du 25/11/2011 à 15 h 01 min 25 sec.
Oui bonjour voilà, ma question j’ai un fichier qui est aux format xml à l’intérieur et je voudrais remplacer 2 balise aux format de même type de format les balise ressemble à ça

<Capacity>20</Capacity>

et

<MaxSpeed>50</MaxSpeed>

c’est un exemple, je voudrais multiplier le nombre entre les balise pour les remplacer par le nouveau nombre du départ multiplier par celui de mon choix, le problème c’est que dans le fichier il y a plusieurs fois le même type de balise avec bien sur des nombres différent à chaque fois. La question est comment extraire chaque nombre 1 à 1 par itération trouver,

D’avance je vous remercie
Edité le 25/11/2011 à 15:05

??? pas sûr d’avoir compris la question, mais si tu dois juste trouver le contenu d’une balise pour le transformer, pourquoi ne pas utiliser les libs XML tel que Elementtree ( [docs.python.org…[/url] ), minidom ( wiki.python.org…[/url] ), pulldom ( [url=http://wiki.python.org/moin/PullDom]wiki.python.org… ) ou carrément Amara2 ( [url=http://xml3k.org/Amara2]xml3k.org…](http://docs.python.org/library/xml.etree.elementtree.html) ) pour accéder à tes noeuds par XPath ?
Edité le 14/11/2011 à 02:27

Il ne s’agit pas que d’une seul balise mais des dizaines aux total et bien sur chaque nombre est différent selon chaque balise et j’ai dis que je suis débutant en python pas de chose compliquer en anglais, ou alors si c’est en anglais j’aimerais y voir plus clair et je dis XML parce que c’est le format intérieur du document ce à quoi il ressemble, mais le but est plutôt de remplacer 1 à 1 tous les balise de type

<Capacity>décimal</Capacity>

et

<MaxSpeed>décimal</MaxSpeed>

chaque nombre entre et étant différent suivant la balise comment faire pour remplacer tous les nombres du départ 1 à 1 multiplier par le même nombre de multiplication qui donnera bien sur un nombre différent à chaque remplacement étant donnée que chaque itération dois avoir un nombre différent de la précédente?

Je ne connais pas Python, mais en PHP, tu peux faire un rechercher/remplacer qui utilise une fonction utilisateur pour le remplacement. Un truc genre (je formalise, à vous de trouver ce qui va bien en Python :)) :

$xml = preg_replace_callback('<Capacity>(\d+)</Capacity>', function ($match) {return '<MaxSpeed>' . $match[1] * N . '</MaxSpeed>';}, $xml)

J’ai trouvé ça : www.php2python.com…

Pour le reste, bonne chance :slight_smile:

UP, Rebonjour je up mon sujet pour dire que j’ai résolu le problème voici le code complet pour ce que je voulais faire

# -*- coding: cp1252 -*-
import re
#Multiplieurs
multiplieurCapacity = int(raw_input('entrée un nombre pour multiplier la Capacitée par '))
multiplieurSpeed = int(raw_input('entrée un nombre pour multiplier la Vitesse par '))
#fichier à traiter
fichier=open("Y:\data\config\simtracks.cfg", "r")
contenu=fichier.read() #Lit tout le fichier d'un coup
def Capacitymulti(Capacity):
    return '<Capacity>' + str(int(Capacity.group(0)[10:-11]) * multiplieurCapacity) + '</Capacity>'
Capacityreplace = re.sub('<Capacity>\d*</Capacity>', Capacitymulti, contenu)
print Capacityreplace
def MaxSpeedmulti(MaxSpeed):
    return '<MaxSpeed>' + str(int(MaxSpeed.group(0)[10:-11]) * multiplieurSpeed) + '</MaxSpeed>'
MaxSpeedreplace = re.sub('<MaxSpeed>\d*</MaxSpeed>', MaxSpeedmulti, Capacityreplace)
print MaxSpeedreplace
fichier2=open("Y:\destination\data\config\simtracks.cfg", "w")
writefile2=fichier2.write(MaxSpeedreplace)
raw_input('Appuie sur <Entrée> ...')

Code en python 2.7.2 bien sur.