#26 Le 13/11/2008, à 19:51
- aleph
Re : [Résolu] Extraire morceau de texte dans une variable
> thierry2351
Le nom de la variable "liste" est un peu malheureux dans le sens où cette variable est dans la nomenclature Python une variable de type "dictionnaire" et non une variable de type "liste", mais c'est bien vu.
Comme autre commentaire, je citerai la signature de Georg Brandl que tu peux croiser sur la mailing -list des développeurs Python, par ex http://mail.python.org/pipermail/python-3000/
--
Thus spake the Lord: Thou shalt indent with four spaces. No more, no less.
Four shall be the number of spaces thou shalt indent, and the number of thy
indenting shall be four. Eight shalt thou not indent, nor either indent thou
two, excepting that thou then proceed to four. Tabs are right out.
#27 Le 13/11/2008, à 20:13
- thierry2351
Re : [Résolu] Extraire morceau de texte dans une variable
Très juste... J'ai tapé le code dans Emacs sans l'enregistrer - et le coquin me fait des indentations de 8 espaces quand je ne suis pas en mode python.... je n'avais pas vu à quel point c'était laid !
Comme l'eût dit Orwell en conclusion :
"Four spaces good, Eight spaces bad"
Hors ligne
#28 Le 13/11/2008, à 20:25
- KicheTof
Re : [Résolu] Extraire morceau de texte dans une variable
Okay merci pour l'expression régulière j'avais bien pensé mais je n'avais jamais vu cette structure
Je testerai ta modif demain au boulo bien que je pourrai mtn, mais j'ai plus la motiv
En tout cas merci à vous !
Ubuntu Intrepid Ibex 64bit
Intel Core2Duo E6750 OC @ 3.52GHz - 4Gb DDR2 1066 - GeForce 7900GTO
Hors ligne
#29 Le 14/11/2008, à 11:51
- KicheTof
Re : [Résolu] Extraire morceau de texte dans une variable
C'est re moi
Alors j'ai installé python sous windows et ça fonctionne nikel
maintenant que je peux le faire sous windows, j'aimerai convertir mon script shell en python
J'ai lu des tutoriaux et autre et je ne trouve pas différentes choses que je vous explique
J'exporte un fichier excel en fichier txt et les valeurs sont séparées par des tabulations
ça ressemble à ça :
id num code quantité nom
2 25 10 5.0 mg méthane
Et je ne trouve pas comment faire pour séparer avec l'espace tabulateur
Ensuite mon script shell me générait les valeurs de ce type
-ISIS- 10150816332D
8 0 0 0 0 0 0 0 0 0999 V2002
9 0 0 0 0 0 0 0 0 0 0 0 0 0 0 6
7 0 0 0 0 0 7
M END
> <ID> (1)
$id
> <champ2> (1)
$test-sed
donc ça j'ai trouvé avec les %s donc du genre
print " -ISIS- 10150816332D
8 0 0 0 0 0 0 0 0 0999 V2002
9 0 0 0 0 0 0 0 0 0 0 0 0 0 0 6
7 0 0 0 0 0 7
M END
> <ID> (1)
%s
> <champ2> (1)
%s" % (id,champ2)
Donc je dois pouvoir m'en sortir juste trouver comment sortir mes valeurs des tabulations.
[EDIT]________________________________________________________________________________
Et j'ai une dernière demande, est-ce possible lors de l'exécution de demander à l'utilisateur d'indiquer l'emplacement des 2 fichiers d'entrées ?
____________________________________________________________________________________
J'ai trouvé la commande raw_input par contre est-ce qu'on peut avoir une fenêtre qui s'ouvre ?
Merci pour votre aide !
Dernière modification par KicheTof (Le 14/11/2008, à 12:13)
Ubuntu Intrepid Ibex 64bit
Intel Core2Duo E6750 OC @ 3.52GHz - 4Gb DDR2 1066 - GeForce 7900GTO
Hors ligne
#30 Le 14/11/2008, à 12:23
- thierry2351
Re : [Résolu] Extraire morceau de texte dans une variable
Salut,
2 25 10 5.0 mg méthane
Et je ne trouve pas comment faire pour séparer avec l'espace tabulateur
chaine.split() -> http://www.python.org/doc/2.5.2/lib/string-methods.html
..... <champ2> (1)
%s" % (id,champ2)
Donc je dois pouvoir m'en sortir
Oui, c'est tout bon je pense !
Et j'ai une dernière demande, est-ce possible lors de l'exécution de demander à l'utilisateur d'indiquer l'emplacement des 2 fichiers d'entrées ?
raw_input() -> cf la doc, la doc encore, la doc toujours
Pour les tutoriels, si tu ne l'a déjà trouvé, il y a l'excellent "Apprendre à programmer avec Python", qui est édité chez O'Reilly et est aussi disponible en ligne (merci l'éditeur et l'auteur !)
La page Python de l'auteur :
http://www.cifen.ulg.ac.be/inforef/swi/python.htm
Les corrigés des exercices contiennent pas mal de bons petits exemples.
Pour aller plus loin, il y a aussi "Plonger au coeur de Python" qui est très bien fait.
http://diveintopython.adrahon.org/
Hors ligne
#31 Le 14/11/2008, à 12:29
- KicheTof
Re : [Résolu] Extraire morceau de texte dans une variable
Merci de tes réponses
je vais regarde du côté de split
J'ai déjà réussis a demander quel fichier et vérifier si il existe
je me suis inspiré d'ici http://python.developpez.com/cours/TutoSwinnen/
je vais regarder le lien que tu m'as donné !
Merci encore
J'ai un petit truc ennuyeux mtn
txt=open(file_txt).read()
test=txt.split('\t')
print test
me renvoi bien une liste [.. , ... , .. ]
mais le dernier de la ligne du fichier texte possède un \n dans la liste et du coup il est join avec le 1er de la ligne suivante
['ID', 'num', 'code', 'Amount', 'NAME\n1', '20', '55', '10 mg', 'methane\n2']
Une petite idée ?
Dernière modification par KicheTof (Le 14/11/2008, à 12:39)
Ubuntu Intrepid Ibex 64bit
Intel Core2Duo E6750 OC @ 3.52GHz - 4Gb DDR2 1066 - GeForce 7900GTO
Hors ligne
#32 Le 14/11/2008, à 13:42
- KicheTof
Re : [Résolu] Extraire morceau de texte dans une variable
j'ai trouvé une parade pour ce \n
txt=open(file_txt).read()
txt=txt.replace("\n","\t")
txt=txt.split('\t')
print txt
Par contre, à la fin du fichier il doit y avoir un retour à la ligne et celui-ci est converti en tabulation et donc est présent dans ma liste.
Je vais tenter de trouver comment supprimé le dernier renvoie à la ligne, si quelqu'un sait je suis preneur
Ubuntu Intrepid Ibex 64bit
Intel Core2Duo E6750 OC @ 3.52GHz - 4Gb DDR2 1066 - GeForce 7900GTO
Hors ligne
#33 Le 14/11/2008, à 13:47
- aleph
Re : [Résolu] Extraire morceau de texte dans une variable
> KicheTop
Quelques petits trucs.
- Pour lire un fichier texte, le mieux est d'utiliser la méthode readlines() de l'objet file. Cette méthode placera chaque ligne incluant un eol dans une liste. Une variable très pratique à être manipulée.
- Le eol de ton fichier Windows est défini par \r\n. Le méthode readlines() convertit automatiquement un \r\n en un \n qui est la représentation *interne* d'un eol en Python. C'est l'aspect multi-plateforme de Python.
- Pour travailler avec des listes: utiliser les "list comprehension" (tiré du langage LISP). C'est très optimisé en Python.
- Se méfier du bouquin de Swimmen, excellent ouvrage mais malheureusement un peu dépassé face aux versions acutelles de Python. Je ne me souviens plus, s'il traite des "list compréhension".
- ***N'oublie jamais*** (en corps 50, gras, rouge) la console pour faire des tests. C'est aussi le moyen le plus rapide et amusant pour apprendre Python.
- Je te souhaite bien du plaisir.
Exemple en console interactive avec un extrait de tes données. data2.txt: Trois lignes avec des blancs/espaces comme séparateurs d'items (ça aurait pu être des tabs). Le fins de lignes sont des \r\n. ***A lire, absever attentivement***
>>> f = open('data2.txt', 'r')
>>> r = f.readlines()
>>> f.close()
>>> #le contenu de r
>>> for ligne in r:
print repr(ligne)
'-0.25000 81250.0000 N 0\n'
' 0.31670 54580.0000 C 0\n'
' 0.75421 09580.0000 C 0\n'
>>> #suppression des \n avec une "list comprehension"
>>> r = [ligne.rstrip() for ligne in r]
>>> #visalisation
>>> for ligne in r:
print repr(ligne)
'-0.25000 81250.0000 N 0'
' 0.31670 54580.0000 C 0'
' 0.75421 09580.0000 C 0'
>>> #travail avec chaque ligne, ici séparation des items
>>> for ligne in r:
print 'la ligne:', repr(ligne)
items = ligne.split()
print 'les items de la ligne:', items #une liste d'items
la ligne: '-0.25000 81250.0000 N 0'
les items de la ligne: ['-0.25000', '81250.0000', 'N', '0']
la ligne: ' 0.31670 54580.0000 C 0'
les items de la ligne: ['0.31670', '54580.0000', 'C', '0']
la ligne: ' 0.75421 09580.0000 C 0'
les items de la ligne: ['0.75421', '09580.0000', 'C', '0']
>>> #etc
>>>
#34 Le 14/11/2008, à 13:56
- thierry2351
Re : [Résolu] Extraire morceau de texte dans une variable
Lis attentivement la doc, elle est en générale très précise - et chaque mot compte
Ça vaut aussi le coup de regarder ce qu'il y a autour de la fonction que tu cherches, il y a souvent celle dont tu avais besoin sans le savoir. Il y a assez souvent une solution toute faite pour la plupart des problèmes courants.
Inutile de préciser '\t', split sans argument tient compte de tous les séparateurs communs.
Si tu veux travailler ligne par ligne, tu peux aussi faire qqchose du genre :
for line in open(filename).readlines():
champs=line.split()
ou bien, juste en dessous de split, tu avais aussi splitlines.
Hors ligne
#35 Le 14/11/2008, à 14:01
- aleph
Re : [Résolu] Extraire morceau de texte dans une variable
Ah, j'oubliais
http://docs.python.org/tutorial/ et
http://www.python.org/doc/ (les premiers liens)
Disponible et distribué en version chm sous Windows, installé d'office avec Python, sous Linux et autre *x prendre la version HTML.
C'est *la* référence.
#36 Le 14/11/2008, à 14:20
- KicheTof
Re : [Résolu] Extraire morceau de texte dans une variable
Merci de votre aide !
Je vais regarder tout ça !
Trop bon le readline ! Avant j'avais une liste avec l'intégralité de mon fichier, tandis que maintenant j'ai une liste par ligne
[EDIT]
Reste a trouver comment m'en servir maintenant
_____________________________________________
j'ai ma petite idée
Mais j'ai un bug lol
for ligne in r:
items = ligne.split()
print "
-ISIS- 10150816332D
0 0 0 0 0 0 0 0 0 0999 V2000
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0
M END
> <ID> (%s)
%s
> <num_cat> ($%s)
%s
\$\$\$\$" % (items[0], items[0],items[0],items[1])
ok ok, les 3 items[0] c'est moche... lol
mais le problème c'est que je dois écrire cette structure et que mon print me met entre " que la première ligne, qui est vide, est-ce que je peux lui mettre des \n ?
____________________________________________________-
Edit ça fonctionne mais ma ligne est sacrément longue lol
Si vous savez comment faire pour ne pas devoir répéter 3x items[0] je prend c'est un détail car mtn que c'est tappé, j'aurai plus besoin de le refaire
Maintenant faut que je trouve comment faire pour que dans ma boucle, lorsque je fais print, que ma variable s'incrémente avec ce que j'affiche, je cherche
___________________________________________________
j'ai pas réfléchi.... lol var = var + "......" et c'est tout bon
Dernière modification par KicheTof (Le 14/11/2008, à 15:16)
Ubuntu Intrepid Ibex 64bit
Intel Core2Duo E6750 OC @ 3.52GHz - 4Gb DDR2 1066 - GeForce 7900GTO
Hors ligne
#37 Le 14/11/2008, à 16:01
- KicheTof
Re : [Résolu] Extraire morceau de texte dans une variable
Alors presque tout fonctionne...
Je vous poste mon script et mon bug.
Mon script
# -*- coding: utf-8 -*-
import re
re_bloc=re.compile(r'(?P<data>\s*-ISIS- .*?> <num_cat> \((?P<id>\d+)\))',re.S)
#Liste données du fichier SDF
def liste_donnees(sdf) :
liste={}
texte=open(sdf).read()
texte=texte.replace("<ID>","<num_cat>")
for data,id in re_bloc.findall(texte) :
liste[id]=data
return liste
#Remplace donnée dans la variable généré à partir du fichier txt
def remplace_donnees(txt,donnees) :
def donnees_de_remplacement(matchobj) :
"""renvoie les données correspondant à l'id"""
try :
return donnees[matchobj.groupdict()['id']]
except :
print "Pas de données pour l'id" ,matchobj.groupdict()['id']
exit()
out=re_bloc.sub(donnees_de_remplacement,txt)
return out
def gen_var_sdf(filename) :
f = open(filename,'r')
r = f.readlines()
f.close()
gen_sdf = ""
for ligne in r:
r = [ligne.rstrip() for ligne in r]
for ligne in r:
items = ligne.split("\t")
gen_sdf = gen_sdf + "\n -ISIS- 10150816332D\n\n 0 0 0 0 0 0 0 0 0 0999 V2000\n 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n 0 0 0 0 0 0 0\nM END\n> <ID> (%s)\n%s\n\n> <num_cat> (%s)\n%s\n\n> <nom_cat> (%s)\n%s\n\n> <fournisseur> (%s)\tintin\n\n> <personne> (%s)\nmoi\n\n> <quantite> (%s)\n%s\n\n> <qualite> (%s)\nn.d.\n\n> <remarques> (%s)\n%s\n\n> <date> (%s)\n12/11/2008\n\n> <Place> (%s)\narmoir\n\n$$$$\n" % (items[0],items[0],items[0],items[2],items[0],items[4],items[0],items[0],items[0],items[3],items[0],items[0],items[1],items[0],items[0])
return gen_sdf
def existe(filename) :
try:
f = open(filename,'r')
f.close();
return 1
except:
return 0
#file_txt = raw_input("Fichier txt généré par excel : ")
#file_sdf = raw_input("Fichier sdf : ")
file_txt='test.txt'
file_sdf='test.sdf'
if existe(file_txt) and existe(file_sdf):
print "Ok on continue...";
else:
print "%s ou %s n'existe pas" % (file_txt,file_sdf)
exit()
gen_sdf = gen_var_sdf(file_txt)
donnee_sdf = liste_donnees(file_sdf)
open("import_pour_isis.sdf","w").write(remplace_donnees(gen_sdf,donnee_sdf))
Le retour
>>>
Ok on continue...
Pas de données pour l'id 5722
Mais le problème, c'est que c'est pas la valeur que je veux
J'aimerai cette valeur id, qui est contenu dans test.sdf
-ISIS- 11100814082D
30 33 0 0 0 0 0 0 0 0999 V2000
-0.2500 0.8125 0.0000 N 0 0 3 0 0 0 0 0 0 0 0 0
0.3167 0.5458 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0
0.7542 1.0958 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0
-0.2833 1.4458 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0
0.3792 1.6625 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0
M CHG 2 6 1 18 -1
M END
> <ID> (5912418)
5912418
Je sais pas si je suis bien clair lol
Dernière modification par KicheTof (Le 14/11/2008, à 16:48)
Ubuntu Intrepid Ibex 64bit
Intel Core2Duo E6750 OC @ 3.52GHz - 4Gb DDR2 1066 - GeForce 7900GTO
Hors ligne
#38 Le 14/11/2008, à 17:33
- KicheTof
Re : [Résolu] Extraire morceau de texte dans une variable
J'ai eu aussi des bug avec cette ligne
re_bloc=re.compile(r'(?P<data>\s*-ISIS- .*?> <num_cat> \((?P<id>\d+)\))',re.S)
j'ai remplacé <num_cat> par num et j'ai plus d'erreur et mon fichier est généré, mais je n'ai pas la modification -ISIS M END de fait
je vous reposte mon script avec les modifs
# -*- coding: utf-8 -*-
import re
import time
re_bloc=re.compile(r'(?P<data>\s*-ISIS- .*?> <num> \((?P<num_cat>\d+)\))',re.S)
#Liste données du fichier SDF
def liste_donnees(sdf) :
liste={}
texte=open(sdf).read()
texte=texte.replace("<ID>","<num_cat>")
for data,num in re_bloc.findall(texte) :
liste[num]=data
return liste
#Remplace donnée dans la variable généré à partir du fichier txt
def remplace_donnees(txt,donnees) :
def donnees_de_remplacement(matchobj) :
"""renvoie les données correspondant à l'id"""
try :
return donnees[matchobj.groupdict()['num']]
except :
print "Pas de données pour l'id" ,matchobj.groupdict()['num']
exit()
out=re_bloc.sub(donnees_de_remplacement,txt)
#out=re_bloc.sub(txt,donnees_de_remplacement)
return out
def gen_var_sdf(filename) :
f = open(filename,'r')
r = f.readlines()
f.close()
gen_sdf = ""
for ligne in r:
r = [ligne.rstrip() for ligne in r]
for ligne in r:
items = ligne.split("\t")
gen_sdf = gen_sdf + "\n -ISIS- 10150816332D\n\n 0 0 0 0 0 0 0 0 0 0999 V2000\n 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n 0 0 0 0 0 0 0\nM END\n> <ID> (%s)\n%s\n\n> <num_cat> (%s)\n%s\n\n> <nom_cat> (%s)\n%s\n\n> <fournisseur> (%s)\nteest\n\n> <personne> (%s)\ntest\n\n> <quantite> (%s)\n%s\n\n> <qualite> (%s)\nn.d.\n\n> <remarques> (%s)\n%s\n\n> <date> (%s)\n12/11/2008\n\n> <Place> (%s)\ntest\n\n$$$$\n" % (items[0],items[0],items[0],items[2],items[0],items[4],items[0],items[0],items[0],items[3],items[0],items[0],items[1],items[0],items[0])
return gen_sdf
def existe(filename) :
try:
f = open(filename,'r')
f.close();
return 1
except:
return 0
#file_txt = raw_input("Fichier txt généré par excel : ")
#file_sdf = raw_input("Fichier sdf : ")
file_txt='test.txt'
file_sdf='test.sdf'
if existe(file_txt) and existe(file_sdf):
print "Ok on continue...";
else:
print "%s ou %s n'existe pas" % (file_txt,file_sdf)
exit()
gen_sdf = gen_var_sdf(file_txt)
donnee_sdf = liste_donnees(file_sdf)
out_name = input("Quel nom pour le fichier de sortie ? (entre guillemet et .sdf !) ")
out_time = time.strftime('%d-%m-%y',time.localtime())
out_namefile = out_time + "_" + out_name
open(out_namefile,"w").write(remplace_donnees(gen_sdf,donnee_sdf))
Ubuntu Intrepid Ibex 64bit
Intel Core2Duo E6750 OC @ 3.52GHz - 4Gb DDR2 1066 - GeForce 7900GTO
Hors ligne
#39 Le 15/11/2008, à 23:48
- thierry2351
Re : [Résolu] Extraire morceau de texte dans une variable
Salut,
lis bien la doc du module re pour comprendre l'expression régulière - et fais des essais, commence par une expression simple.
La syntaxe (?P<name>....) permet de récupérer ultérieurement le bloc entre () par matchobj.groupdict()['name']
Une remarque sur les "list comprehesions" :
[ ligne.rstrip() for ligne in r] EST la liste formée des ligne.rstrip() pour chaque ligne dans r.
Il ne sert donc à rien de le mettre dans une boucle "for ligne in r :"
Comme on te l'a conseillé, fais de petits tests dans la console !
Hors ligne
#40 Le 16/11/2008, à 13:43
- KicheTof
Re : [Résolu] Extraire morceau de texte dans une variable
Hello !
Merci de ta réponse je cherche pour réussir a m'afficher le id transformé dans un des fichiers pour le remettre après dans l'autre fichier sous num_cat mais c'est encore galère...
biensur je teste après chaque modification dans la console, sans elle je serai à la rue
je vais chercher encore et vous tiendrais au courant demain
Ubuntu Intrepid Ibex 64bit
Intel Core2Duo E6750 OC @ 3.52GHz - 4Gb DDR2 1066 - GeForce 7900GTO
Hors ligne
#41 Le 17/11/2008, à 10:45
- KicheTof
Re : [Résolu] Extraire morceau de texte dans une variable
Re à tous !
J'ai toujours mon bug, je vous explique, j'ai modifié l'expression de cette manière
re_bloc=re.compile(r'(?P<data>\s*-ISIS- .*?> <cat> \((?P<cat>\d+)\))',re.S)
dans ma fonction qui génère va variable, j'ai remplacé num_cat par cat et dans mon fichier qui contient un ID je l'ai renommé en cat
du coup ça me donne ça :
#Liste données du fichier SDF
def liste_donnees(sdf) :
liste={}
texte=open(sdf).read()
texte=texte.replace("<ID>","<cat>")
for data,cat in re_bloc.findall(texte) :
liste[cat]=data
return liste
#Remplace donnée dans la variable généré à partir du fichier txt
#def remplace_donnees(txt,donnees) :
def remplace_donnees(txt,donnees) :
def donnees_de_remplacement(matchobj) :
#print matchobj.groupdict()['cat']
"""renvoie les données correspondant à l'id"""
try :
return donnees[matchobj.groupdict()['cat']]
except :
print "Pas de données pour l'id" ,matchobj.groupdict()['cat']
exit()
out=re_bloc.sub(donnees_de_remplacement,txt)
#out=re_bloc.sub(txt,donnees_de_remplacement)
return out
et quand je lance dans la console, j'obtiens ceci :
>>>
Ok on continue...
Quel nom pour le fichier de sortie ? (entre guillemet et .sdf !) "t"
Pas de données pour l'id 5722
ce chiffre, 5722, est contenu dans ma variable txt de la fonctionne, et qui correspond à ID dans cette même variable, mais je ne comprend pas vu que j'ai tout viré ce qui est ID et il me le sort tout de même, je soupçonne l'expression régulière, mais comment... je sais pas !
Je crois savoir, l'expression s'attend à avoir -ISIS ?> et directement après <cat> sauf que dans ma variable texte ça se représente sous cette forme : M END\n> <ID> (%s)\n%s\n\n> <cat> (%s)\n%s\n\n>
Je saiiiiiiiiiiiiiiiiiis pourquoi, mais je sais pas faire lol...
r'(?P<data>\s*-ISIS- .*?> <cat> \((?P<cat>\d+)\))'
récupère la valeur de cat qui est entre parenthèse, admetton
> <ID> (1)
1
> <cat> (1)
ref12-a-23
> <nom_cat> (1)
test
donc il récupèrera 1 qui se trouve entre ( ) (la valeur entre parenthèse est identique pour tous les champs du même bloc), sauf que la valeur dont j'ai besoin est la valeur se trouvant juste en dessous..
c'est faisable ?
Dernière modification par KicheTof (Le 17/11/2008, à 11:47)
Ubuntu Intrepid Ibex 64bit
Intel Core2Duo E6750 OC @ 3.52GHz - 4Gb DDR2 1066 - GeForce 7900GTO
Hors ligne
#42 Le 17/11/2008, à 13:50
- KicheTof
Re : [Résolu] Extraire morceau de texte dans une variable
Je suis pas loin mais j'ai toujours un bug...
regex=re.compile(r'(?P<cat><cat>.*?>)',re.S)
me renvoi
['<cat> (1)\nref12_12\n\n>']
___________________________________________
J'ai réussis a réduire un peu
regex=re.compile(r'(?P<cat><cat>.*?\n[0-9]*)',re.S)
renvoi
['<cat> (5722)\n5912418']
Dernière modification par KicheTof (Le 17/11/2008, à 14:14)
Ubuntu Intrepid Ibex 64bit
Intel Core2Duo E6750 OC @ 3.52GHz - 4Gb DDR2 1066 - GeForce 7900GTO
Hors ligne
#43 Le 17/11/2008, à 14:18
- thierry2351
Re : [Résolu] Extraire morceau de texte dans une variable
Salut,
si on décrit ce que tu veux, c'est :
<cat>, des espaces, (, des chiffres, ), un retour à la ligne, ta référence sur une ligne, un retour à la ligne, ....
Les espaces et le retour à la ligne peuvent tous être représentés par \s (\s+ s'il peut y en avoir plusieurs, comme \r\n)
Ta référence est formée d'au moins un caractère quelconque (sauf des espaces, apparemment) : tu peux la représenter par \S+
Tu peux donc récrire le morceau d'expression comme cela :
<cat>\s+\(\d+\)\s+\S+\s+
et si tu veux récupérer l'expression :
<cat>\s+\(\d+\)\s+\(?P<nom_de_la_cle>S+)\s+
Si tu as une expression plus complexe, (pouvant contenir des espaces), il faudra la décrire plus précisément.
Une autre solution pour récupérer des expressions tenant sur une ligne est d'employer :
^ et $ qui matchent le début et la fin de la chaîne.
Tu peux ajouter le flag re.M pour qu'ils matchent aussi les débuts et fins de lignes :
>>> ch='ligne1\nligne2'
>>> re.findall('^.*$',ch,re.M)
['ligne1', 'ligne2']
Il y a une petite modification à faire si on utilise aussi le flag re.S qui permet au . de matcher les retours à la ligne : en effet,
>>> re.findall('^.*$',ch,re.M|re.S)
['ligne1\nligne2']
Il faut alors dire à .* d'être moins gourmand et de se limiter au plus petit morceau de texte qui convient, en le faisant suivre d'un ? :
>>> re.findall('^.*?$',ch,re.M|re.S)
['ligne1', 'ligne2']
Dernière modification par thierry2351 (Le 17/11/2008, à 14:19)
Hors ligne
#44 Le 17/11/2008, à 14:38
- KicheTof
Re : [Résolu] Extraire morceau de texte dans une variable
Hello merci de ta réponse, malheureusement ton expression me renvoi la même chose que moi plus haut.
regex=re.compile(r'(<cat>\s+\(\d+\)\s+\S+\s+)',re.S)
txt=" -ISIS- 10150816332D\n\n 0 0 0 0 0 0 0 0 0 0999 V2000\n 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n\n0 0 0 0 0 0 0\nM END\n> <cat> (1)\n12ref-5\n\n> <ID> (1)\n1"
liste=regex.findall(txt)
print repr(liste)
me renvoi
['<cat> (1)\n12ref-5\n\n']
donc il faut isoler 12ref-5 mais je sèche :S
et cette expression
regex=re.compile(r'(<cat>\s+\(\d+\)\s+(?P<cat>\S+)\s+)',re.S)
me renvoi
[('<cat> (1)\n12ref-5\n\n', '12ref-5')]
donc y'a un champ de trop dans la liste
Dernière modification par KicheTof (Le 17/11/2008, à 14:42)
Ubuntu Intrepid Ibex 64bit
Intel Core2Duo E6750 OC @ 3.52GHz - 4Gb DDR2 1066 - GeForce 7900GTO
Hors ligne
#45 Le 17/11/2008, à 14:42
- thierry2351
Re : [Résolu] Extraire morceau de texte dans une variable
et si tu veux récupérer l'expression :...
Hors ligne
#46 Le 17/11/2008, à 14:44
- KicheTof
Re : [Résolu] Extraire morceau de texte dans une variable
désolé j'avais oublié de la poster, j'ai édité mon poste
par contre, y'a 2 champs dans la liste, et si je pouvais avoir qu'un ça serai géant
Enfaite, il y a un seul champ dans la liste, sous la forme de [(...,...)] donc je sais pas comment faire
trouvé !!!
regex=re.compile(r'<cat>\s+\(\d+\)\s+(?P<cat>\S+)\s+',re.S)
j'avais mis des parenthèse entre les ' ....
niquel, donc mtn faut que j'essaie de l'ajouter avec l'autre regex
Dernière modification par KicheTof (Le 17/11/2008, à 15:23)
Ubuntu Intrepid Ibex 64bit
Intel Core2Duo E6750 OC @ 3.52GHz - 4Gb DDR2 1066 - GeForce 7900GTO
Hors ligne
#47 Le 17/11/2008, à 15:50
- KicheTof
Re : [Résolu] Extraire morceau de texte dans une variable
ça fonctionne presque !!!!
Il y a juste un petit truc qui déconne encore
lorsque je fais passer mon fichier texte à la moulinette pour obtenir une variable avec les valeurs -ISIS .... M END etc et qu'il passe ensuite dans la fonction de remplacement avec sub, il me remplace parfaitement les valeurs comprises entre -ISIS ... M END mais il me remplace aussi ceci
admettons :
> <num_cat> (1)
1256
et bien il me le remplace de cette manière
> <num_cat> (1256)
1256
Et je veux pas qu'il me remplace le numéro entre parenthèse
voilà ma regex
re_bloc=re.compile(r'(?P<data>\s*-ISIS- .*?> <num_cat>\s+\(\d+\)\s+(?P<num_cat>\S+)\s+)',re.S)
à mon avis c'est pas grand chose mais je sais pas comment faire :S
Dernière modification par KicheTof (Le 17/11/2008, à 15:56)
Ubuntu Intrepid Ibex 64bit
Intel Core2Duo E6750 OC @ 3.52GHz - 4Gb DDR2 1066 - GeForce 7900GTO
Hors ligne
#48 Le 18/11/2008, à 09:21
- KicheTof
Re : [Résolu] Extraire morceau de texte dans une variable
Re !
Je pioche toujours, j'ai testé cette regex
#re_bloc=re.compile(r'(?P<data>\s*-ISIS- .*?> <num_cat>\s+\(\d+\)\s+(?P<num_cat>\S+)\s+)',re.S)
re_bloc=re.compile(r'(?P<data>\s*-ISIS- .*?> <num_cat>\s+\d+\s+(?P<num_cat>\S+)\s+)',re.S)
j'ai donc supprimé \(\d+\) par \d+, du coup il ne me remplace plus le numéro entre parenthèse, mais il ne remplace plus la partie -ISIS... :S
Ubuntu Intrepid Ibex 64bit
Intel Core2Duo E6750 OC @ 3.52GHz - 4Gb DDR2 1066 - GeForce 7900GTO
Hors ligne
#49 Le 19/11/2008, à 09:00
- KicheTof
Re : [Résolu] Extraire morceau de texte dans une variable
un p'tit up
Ubuntu Intrepid Ibex 64bit
Intel Core2Duo E6750 OC @ 3.52GHz - 4Gb DDR2 1066 - GeForce 7900GTO
Hors ligne
#50 Le 19/11/2008, à 11:55
- KicheTof
Re : [Résolu] Extraire morceau de texte dans une variable
Je viens de m'apercevoir de quelque chose, la regex pour récupérer -ISIS M END n'est pas tout a fait juste, lors de la lecture, j'ai fais un print et voila ce que j'obtiens
re_bloc=re.compile(r'(?P<data>\s*-ISIS- .*?> <num_cat>\s+\(\d+\)\s+(?P<num_cat>\S+)\s+)',re.S)
def liste_donnees(sdf) :
liste={}
texte=open(sdf).read()
texte=texte.replace("<ID>","<num_cat>")
for data,num_cat in re_bloc.findall(texte) :
liste[num_cat]=data
print data
print num_cat
return liste
Renvoie
-ISIS- 11100814082D
24 25 0 0 0 0 0 0 0 0999 V2000
-2.3500 -1.7667 0.0000 S 0 0 3 0 0 0 0 0 0 0 0 0
-0.0208 -0.7667 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0
M END
> <num_cat> (ref12_5)
ref12_5
ref_12_5
Donc data contient de -ISIS à ref12_5 et num_cat contient bien ref12_5 donc enfaite, la regex pour data contient trop d'information
______________________________________
C'est étrange, j'ai testé la regex seule, et elle va bien de ISIS à M END\n>
bizarre, vous avez une idée ?
Dernière modification par KicheTof (Le 19/11/2008, à 12:08)
Ubuntu Intrepid Ibex 64bit
Intel Core2Duo E6750 OC @ 3.52GHz - 4Gb DDR2 1066 - GeForce 7900GTO
Hors ligne