Bonjour ,
Tu te lances dans les expressions régulières. Très bien !
Au début, ça paraît inextricable comme une moto démontée. Mais une fois tout en place et réglages faits, ça roule avec bonheur.
Bon, pour l’instant , on n’en est pas aux réglages....
Pour m’éviter de réécrire des choses que j’ai déjà écrite, je te renvoie sur ce post:
http://www.developpez.net/forums/d86...o/#post4943788
1) Car il t’a encore échappé pour le moment qu’en écrivant:
1 2 3 4 5 6
| titleStr = titlePat.search(line)
varStr = varPat.search(line)
zoneStr = zonePat.search(line)
ImStr = IPat.search(line)
JmStr = JPat.search(line)
KmStr = KPat.search(line) |
tu obtiens des MatchObjects:
titleStr, varStr, zoneStr, ImStr, JmStr, KmStr
que tu peux directment interroger, quand ils ne sont pas None, pour en tirer toutes sortes de renseignements sur la chaîne matchante,
SI tu as défini des groupes au moyen de parenthèses dans la RE:
1 2 3 4
| titlePat= re.compile('TITLE *= *"([^"])"')
titleStr = titlePat.search(line)
if titleStr: # si tilteStr est None, ce test donnera False
title = titleStr.group(1) |
Ce n’est ainsi pas la peine de passer par eval()
2) La seconde chose à bien noter, c’est que l’utilisation des regex permet de rechercher directement dans la chaîne qui constitue le fichier: ce n’est pas la peine de passer les lignes en revue.
Qu’est ce que j’entends par chaîne qui constitue le fichier ?
Plaons dans un fichier ’fifi.txt’ ton texte:
TITLE = "Champ"
VARIABLES = "X1" "X2" "X3" "Fn"
ZONE T="Patch_02"
I= 28 J= 48 K= 1 F=POINT
Lisons le par le code suivant
1 2 3 4
| f = open(fifi.txt)
ch = f.read()
f.close()
print ch |
on obtient
1 2 3 4
| TITLE = "Champ"
VARIABLES = "X1" "X2" "X3" "Fn"
ZONE T="Patch_02"
I= 28 J= 48 K= 1 F=POINT |
Non !!? Sans blague ??! What else ?
Mais ce qu’on obtient est l’affichage de la chaîne ch, pas sa valeur.
Par affichage, j’entends que les caractères de fin de ligne ’\n’ sont interprétés par le moteur de rendu (je crois que c’est ainsi que ça s’appelle) pour produire des retours à la ligne. Ce qu’on voit à l’écran , ce sont donc des lignes.
Mais dans le fichier, il n’y a pas de lignes, il n’y a que des caractères ’\n’ épars.
La chaîne qui constitue le fichier est donc tous les caractères affichés par print + les fins de lignes ’\n’ qu’on ne voit pas à l’affichage.
Un fichier sur un disque dur n’est rien d’autre que la suite continue des caractères d’une chaîne.
Comment faire pour visualiser les ’\n’ présents dans un fichier ?
Grâce à la fonction repr() , qui affiche une chaîne représentant ce qui devrait être écrit pour obtenir un objet égal à l’argument de repr() .
Par exemple si li est une liste et que repr(li) est
[34, 23, 89, 120]
cela veut dire que pour définir li par une instruction d’affectation, il faudrait écrire li = [34, 23, 89, 120]
Pour une chaîne chex dont l’affichage donnerait
un beau soleil
repr(chex) sera ’un beau soleil’ car, si la valeur de chex est un beau soleil , la manière de la définir serait par contre chex = ’un beau soleil’.
Ce que je veux dire c’est que les deux apostrophes au début et à la fin font partie de la représentation fournie par repr() , pas de la valeur de chex.
Pour en revenir au fichier, le code suivant
1 2 3 4
| f = open('fifi.txt')
ch = f.read()
f.close()
print repr(ch) |
donne
'TITLE = "Champ"\nVARIABLES = "X1" "X2" "X3" "Fn"\nZONE T="Patch_02"\nI= 28 J= 48 K= 1 F=POINT '
ce qui veut dire que le contenu du fichier = la chaîne qui constitue le fichier est
TITLE = "Champ"\nVARIABLES = "X1" "X2" "X3" "Fn"\nZONE T="Patch_02"\nI= 28 J= 48 K= 1 F=POINT
Ceci étant précisé, je reviens au début: on peut lancer la recherche titlePat.search() non pas sur chaque ligne, mais sur la chaîne qui constitue le fichier d’un seul bloc:
1 2 3 4
| f = open('fifi.txt')
ch = f.read()
f.close()
titleStr = titlePat.search(ch) |
3) Troisième chose:
on peut définir plusieurs groupes dans une même RE, et donc ne recourir qu’à une seule regex pour trouver en une seule fois toutes les informations.
Je reviendrai sur le sujet
Voyons si tout ceci te permet d’avancer et améliorer ton code.
Partager