Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#26 Le 13/11/2008, à 20: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, à 21: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, à 21:25

KicheTof

Re : [Résolu] Extraire morceau de texte dans une variable

Okay merci pour l'expression régulière smile j'avais bien pensé mais je n'avais jamais vu cette structure smile

Je testerai ta modif demain au boulo smile bien que je pourrai mtn, mais j'ai plus la motiv smile

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, à 12:51

KicheTof

Re : [Résolu] Extraire morceau de texte dans une variable

C'est re moi smile

Alors j'ai installé python sous windows et ça fonctionne nikel smile

maintenant que je peux le faire sous windows, j'aimerai convertir mon script shell en python smile

J'ai lu des tutoriaux et autre et je ne trouve pas différentes choses que je vous explique smile

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 smile 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 smile 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, à 13:13)


Ubuntu Intrepid Ibex 64bit
Intel Core2Duo E6750 OC @ 3.52GHz - 4Gb DDR2 1066 - GeForce 7900GTO

Hors ligne

#30 Le 14/11/2008, à 13: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 smile

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 tongue

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, à 13:29

KicheTof

Re : [Résolu] Extraire morceau de texte dans une variable

Merci de tes réponses smile

je vais regarde du côté de split smile

J'ai déjà réussis a demander quel fichier et vérifier si il existe smile

je me suis inspiré d'ici http://python.developpez.com/cours/TutoSwinnen/

je vais regarder le lien que tu m'as donné !

Merci encore smile

J'ai un petit truc ennuyeux mtn sad

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 ? smile

Dernière modification par KicheTof (Le 14/11/2008, à 13:39)


Ubuntu Intrepid Ibex 64bit
Intel Core2Duo E6750 OC @ 3.52GHz - 4Gb DDR2 1066 - GeForce 7900GTO

Hors ligne

#32 Le 14/11/2008, à 14: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

smile

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 smile


Ubuntu Intrepid Ibex 64bit
Intel Core2Duo E6750 OC @ 3.52GHz - 4Gb DDR2 1066 - GeForce 7900GTO

Hors ligne

#33 Le 14/11/2008, à 14: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, à 14: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 smile
Ç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. wink

Hors ligne

#35 Le 14/11/2008, à 15: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, à 15:20

KicheTof

Re : [Résolu] Extraire morceau de texte dans une variable

Merci de votre aide !

Je vais regarder tout ça ! big_smile

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 smile

[EDIT]
Reste a trouver comment m'en servir maintenant smile
_____________________________________________

j'ai ma petite idée big_smile

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 big_smile c'est un détail car mtn que c'est tappé, j'aurai plus besoin de le refaire smile

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 smile
___________________________________________________

j'ai pas réfléchi.... lol var = var + "......" et c'est tout bon big_smile

Dernière modification par KicheTof (Le 14/11/2008, à 16:16)


Ubuntu Intrepid Ibex 64bit
Intel Core2Duo E6750 OC @ 3.52GHz - 4Gb DDR2 1066 - GeForce 7900GTO

Hors ligne

#37 Le 14/11/2008, à 17: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 sad

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, à 17:48)


Ubuntu Intrepid Ibex 64bit
Intel Core2Duo E6750 OC @ 3.52GHz - 4Gb DDR2 1066 - GeForce 7900GTO

Hors ligne

#38 Le 14/11/2008, à 18: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 sad

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 16/11/2008, à 00: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, à 14:43

KicheTof

Re : [Résolu] Extraire morceau de texte dans une variable

Hello !

Merci de ta réponse smile 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 smile

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, à 11: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 ! sad

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 ? smile

Dernière modification par KicheTof (Le 17/11/2008, à 12:47)


Ubuntu Intrepid Ibex 64bit
Intel Core2Duo E6750 OC @ 3.52GHz - 4Gb DDR2 1066 - GeForce 7900GTO

Hors ligne

#42 Le 17/11/2008, à 14: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, à 15:14)


Ubuntu Intrepid Ibex 64bit
Intel Core2Duo E6750 OC @ 3.52GHz - 4Gb DDR2 1066 - GeForce 7900GTO

Hors ligne

#43 Le 17/11/2008, à 15: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, à 15:19)

Hors ligne

#44 Le 17/11/2008, à 15: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, à 15:42)


Ubuntu Intrepid Ibex 64bit
Intel Core2Duo E6750 OC @ 3.52GHz - 4Gb DDR2 1066 - GeForce 7900GTO

Hors ligne

#45 Le 17/11/2008, à 15: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, à 15: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 wink

par contre, y'a 2 champs dans la liste, et si je pouvais avoir qu'un ça serai géant big_smile

Enfaite, il y a un seul champ dans la liste, sous la forme de [(...,...)] donc je sais pas comment faire

trouvé !!! big_smile

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 smile

Dernière modification par KicheTof (Le 17/11/2008, à 16:23)


Ubuntu Intrepid Ibex 64bit
Intel Core2Duo E6750 OC @ 3.52GHz - 4Gb DDR2 1066 - GeForce 7900GTO

Hors ligne

#47 Le 17/11/2008, à 16:50

KicheTof

Re : [Résolu] Extraire morceau de texte dans une variable

ça fonctionne presque !!!! cool

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, à 16:56)


Ubuntu Intrepid Ibex 64bit
Intel Core2Duo E6750 OC @ 3.52GHz - 4Gb DDR2 1066 - GeForce 7900GTO

Hors ligne

#48 Le 18/11/2008, à 10: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, à 10:00

KicheTof

Re : [Résolu] Extraire morceau de texte dans une variable

un p'tit up cool


Ubuntu Intrepid Ibex 64bit
Intel Core2Duo E6750 OC @ 3.52GHz - 4Gb DDR2 1066 - GeForce 7900GTO

Hors ligne

#50 Le 19/11/2008, à 12: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, à 13:08)


Ubuntu Intrepid Ibex 64bit
Intel Core2Duo E6750 OC @ 3.52GHz - 4Gb DDR2 1066 - GeForce 7900GTO

Hors ligne