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.

#51 Le 19/11/2008, à 13:56

KicheTof

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

Enfaite, pour moi je peux récupérer uniquement les chiffre entre -ISIS et M  END et ça me va tout aussi smile

je sèche un peu, quelqu'un pour m'aider ?

voila mon dernier test non concluant

re_bloc=re.compile(r'(\s*-ISIS- .*?\S+(?P<data>\S+)\sM  END\s>  <num_cat>\s+\(\d+\)\s+(?P<num_cat>\S+)\s+)',re.S)

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

Hors ligne

#52 Le 19/11/2008, à 14:32

aleph

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

# -*- coding: cp1252 -*-
#--------------------------------------------------------------------
# Name:      jobisis.py
# Purpose:   test
# Author:    Jean-Michel Fauth, Switzerland
# Copyright: None
# Licence:   None
# os dev:    winXP sp2
# py dev:    Python 2.5.2 / Python 2.6
# wx dev:    
# Revision:  19 November 2008
#--------------------------------------------------------------------

source = '''\
  -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
  2  1  1  0  0  0  0
  3  2  1  0  0  0  0
  4  1  1  0  0  0  0
M  CHG  2   6   1  18  -1
M  END
>  <ID> (5912418)
5912418'''

def main():
    
    #simule lecture de fichier
    r = source.split('\n')
    
    #détermination de limites
    start, stop, idn = -1, -1, -1
    for i, e in enumerate(r):
        if '-ISIS-' in e:
            start = i
        if 'M  END' in e:
            stop = i
        if '<ID>' in e:
            nid = i
    
    #exctraction des données
    nr = r[start+1: stop]
    
    #suppression éventuelles des lignes vides
    nr = [e for e in nr if len(e) != 0]

    #récupération du <ID>
    z = r[nid]
    t =  z.split()
    t = t[len(t)-1]
    t = t[1:-1]
    
    #affichage des résultats
    print 'id:', t
    print '----'
    for e in nr:
        print e

#--------------------------------------------------------------------

if __name__ == '__main__':
    main()

#eof-----------------------------------------------------------------

#53 Le 19/11/2008, à 14:39

thierry2351

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

Salut,
qq conseils qui peuvent (peut-être smile ) t'être utiles :

- si tu récris ton expression sans les groupes, tu y verras ss doute plus clair. En particulier, il y a :
.*?\S+\S+
à la suite... Vois-tu ce qui va matcher quoi là dedans ?
Tu peux tester :

re.findall('DEBUT(.*?)(\S+)(\S+)FIN', 'DEBUT Une phrase pour testerFIN')
[(' Une phrase pour ', 'teste', 'r')]

- tu pourrais récrire la re proprement, puis ajouter les groupes
- relis (encore et encore) la doc du module re et essaie !

Hors ligne

#54 Le 19/11/2008, à 15:27

KicheTof

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

Merci pour vos réponses, je vais tester ça ! smile

Dernière modification par KicheTof (Le 19/11/2008, à 15:27)


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

Hors ligne

#55 Le 19/11/2008, à 15:53

KicheTof

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

thierry2351 a écrit :

Salut,

re.findall('DEBUT(.*?)(\S+)(\S+)FIN', 'DEBUT Une phrase pour testerFIN')
[(' Une phrase pour ', 'teste', 'r')]

Je n'y arrive pas à cause des retour à la ligne je pense, malheureusement je sèche avec la regex :S trop peine et trop peu de temps sad


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

Hors ligne

#56 Le 19/11/2008, à 22:54

aleph

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

>>> import re
>>> cpat = re.compile('DEBUT.*FIN', re.DOTALL)
>>> r = cpat.search('DEBUT Une phrase\npour tester FIN')
>>> s = r.group()
>>> s
DEBUT Une phrase
pour tester FIN
>>> s = s[len('DEBUT'):-len('FIN')]
>>> s
 Une phrase
pour tester 
>>> s = s.strip()
>>> s
Une phrase
pour tester
>>> s = s.split('\n')
>>> s
['Une phrase', 'pour tester']

#57 Le 19/11/2008, à 23:48

thierry2351

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

Salut,
L'exemple était pour montrer une façon de voir comment se comporte ton expression régulière : quelle partie de l'expression correspond à quelle partie de la chaîne. C'est rapide avec findall.

Pour corriger ton expression :

tu as (corrige toi-même si ce n'est pas exactement ça....)
-ISIS-, au moins 1 espace et/ou retours à la ligne, (au moins un caractère imprimable, tout ce qu'on veut), au moins 1 espace et/ou retour à la ligne, M  END
La partie qui t'intéresse est celle entre parenthèses.
Cela donne, en langage re :

-ISIS-\s+(\S.*?)\s+M  END

avec toujours la partie qui t'intéresse entre parenthèses
Le ? est nécessaire pour rendre .* non-gourmand (non greedy) : sans cela, il consommerait tout et ne s'arrêterait que devant le tout dernier \s+M  END du fichier

Si tu veux donner un nom au bloc entre parenthèses ("data", par exemple)  il suffit d'ajouter :

-ISIS-\s+(?P<data>\S.*?)\s+M  END

qe qui donnerait au final : (sous réserve des éventuelles erreurs sus-mentionnées)

re_bloc=re.compile(r'(\s*-ISIS-\s+(?P<data>\S.*?)\s+M  END\s>  <num_cat>\s+\(\d+\)\s+(?P<num_cat>\S+)\s+)',re.S)

Hors ligne

#58 Le 20/11/2008, à 09:37

aleph

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

> thierry2351

Je ne mets pas en cause ta façon de travailler. Les expressions régulières sont un science en elles-mêmes. J'essaie simplement de proposer une variation simple. (Il n'y a qu'un seul "-ISIS-" et "M END").

Cela dit, j'ai aussi proposé des méthodes de travail peut-être moins élégantes mais efficaces et je pense adaptées à quelqu'un qui débute en Python...

#59 Le 20/11/2008, à 10:20

KicheTof

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

Merci à vous 2 !

J'ai pris l'option d'aleph comme ça, si mon champs -ISIS M  END n'est pas suivi de ID ça fonctionne, sinon avec l'expression pas forcément.

Et je suis entrain de restructuré le script.

Actuellement, je génèrait une variable contenant -isis ..... et les valeurs, puis je faisais une comparaison/remplacement des 2.

Je me suis dis, lorsque je génère ma variable -isis autant lui mettre directement mes champs dedans comme ça fini ! smile

J'ai juste un bug avec ma liste et je ne voit pas pourquoi. (il y a plusieur isis m  end mais avec mon teste, c'est bon smile

sdf="test.sdf"
txt=open(sdf).read()
txt=txt.replace("<ID>","<num_cat>")

txt=txt.split('\n')
start, stop, ncat = -1, -1, -1
liste={}
for i, e in enumerate(txt):
    if '-ISIS-' in e:
        start = i
    if 'M  END' in e:
        stop = i
    if '<num_cat>' in e:
        ncat = i
    #print "%s - %s - %s" % (start,stop,ncat)
    if start > -1 and stop > -1 and ncat > -1:
        nr = txt[start+1: stop]
        cat = txt[ncat+1]
        if not liste[cat]:
            liste[cat]=nr

et la console me renvoi :
if not liste[cat]:
KeyError: 12456 (qui est ma valeur contenu dans cat)

j'ai trouvé avec has_key smile maintenant faut que je regroupe toutes les valeurs de liste contenues dans nr dans un variable simple

Dernière modification par KicheTof (Le 20/11/2008, à 11:00)


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

Hors ligne

#60 Le 20/11/2008, à 11:03

aleph

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

1) cat ou ncat ?

2) Ne nomme pas liste un dictionnaire.

3) Utilise readlines(). Il est inutile de lire tout, pour par la suite le diviser en lignes. Accessoirement, c'est plus efficace pour de gros fichiers (une histoire de buffering interne à Python dans les procédures io).

4) Si tu es bloqué par un bout de code, ne néglige pas la console Python pour faire des tests. Tes progrès seront fulgurants. Je ne serais pas surpris qu'il arrive un moment où tu remarques que tout peu se faire avec une console. Après tout, c'est bien ce que tu voulais faire à coup de awk, sed...

#61 Le 20/11/2008, à 11:26

KicheTof

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

ncat est le numéro de ligne et cat est la valeur de la ligne que je veux mettre comme index dans mon tableau.

je vais tester avec readline si c'est plus propre dans mon code smile

Effectivement c'est exactement ce que je voulais faire avec d'autre méthode plus longue wink

J'utilise la console avec mon script pour éviter de retapper sans cesse les lignes, donc je modifie juste dans mon script smile

yeeeees !

J'ai réussi a tout faire !

je vais maintenant faire une fonction et intégrer le tout à mon script final ! J'espère que cette fois c'est la bonne ! big_smile

Dernière modification par KicheTof (Le 20/11/2008, à 11:37)


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

Hors ligne

#62 Le 20/11/2008, à 12:15

aleph

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

> KicheTof

Mea culpa pour ncat/cat.

Attention, il y a readline et readlines (avec un s final)

>>> f = open('out.txt')
>>> dir(f)
['__class__', '__delattr__', '__doc__', '__enter__', '__exit__', '__format__',
'__getattribute__', '__hash__', '__init__', '__iter__', '__new__', '__reduce__',
'__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__',
'__subclasshook__', 'close', 'closed', 'encoding', 'errors', 'fileno', 'flush',
'isatty', 'mode', 'name', 'newlines', 'next', 'read', 'readinto', 'readline',
'readlines', 'seek', 'softspace', 'tell', 'truncate', 'write', 'writelines',
'xreadlines']
>>> print f.readline.__doc__
readline([size]) -> next line from the file, as a string.

Retain newline.  A non-negative size argument limits the maximum
number of bytes to return (an incomplete line may be returned then).
Return an empty string at EOF.
>>> print f.readlines.__doc__
readlines([size]) -> list of strings, each a line from the file.

Call readline() repeatedly and return a list of the lines so read.
The optional size argument, if given, is an approximate bound on the
total number of bytes in the lines returned.
>>> f.close()

#63 Le 20/11/2008, à 12:25

KicheTof

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

Pardon faute de frappe, j'ai bien pris readlineS wink

Merci de l'info smile


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

Hors ligne

#64 Le 20/11/2008, à 12:53

KicheTof

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

j'ai finiiiiiiiiiiiiiiii big_smile

ça fonctionne parfaitement ! big_smile

C'est peut-être pas très très propre, mais c'est pas grave, ça fonctionne big_smile


Un énorme merci à vous !

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


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

Hors ligne

#65 Le 20/11/2008, à 14:10

thierry2351

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

> aleph :
Pas de pb ! L'important est que ça marche - et que KicheTof ait appris qq chose, ce qui est le cas !

> KicheTof :
Content pour toi smile

Hors ligne

#66 Le 20/11/2008, à 15:07

KicheTof

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

smile

Maintenant je m'amuse, j'essaie de coloriser la console, mais ça fonctionne pas lol

print "\033[31m"+"Les fichiers existe !\nOn continue..."

il me renvoie ça : Les fichiers existe !

je sais pas si c'est parce que c'est une console installée sur windows, mais bon. Si vous avez une solution je prend sinon c'est du gadget big_smile


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

Hors ligne

#67 Le 20/11/2008, à 16:54

aleph

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

> KicheTof

Il y quand même quelque chose qui m'intrigue et qui expliquerait certains de tes commentaires.
Quand tu parles de console, tu fais allusion

- à la console sous Linux ou à la l'invite de commande (DOS) sous Windows, c'est à dire en lançant Python avec une commande $python ou c:>python pour obtenir les >>>

ou

- à un interpréteur interactif Python comme IDLE, par ex

http://www.coquitlamcollege.com/adawson/Python_Editor_IDLE.htm sous Windows
et
http://www.linux-user.de/ausgabe/2003/05/078-python/index.html

Les deux versions travaillent de façon identique.

Il existe de nombreux interpréteurs interactifs. IDLE est la version multi-plateforme proposée par le stuff Python, installée d'office sous Windows quand on installe Python, à télécharger séparément depuis les dépôts pour Linux/Ubuntu.

Pour ma part, j'utilise psi : http://spinecho.ze.cx/ > psi

#68 Le 20/11/2008, à 17:42

KicheTof

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

Je parle de IDLE installé d'office avec python smile

bien plus agréable au yeux que l'invite de commande MS-DOS. Je préfère de loin le terminal sous linux qui est personnalisable smile


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

Hors ligne

#69 Le 20/11/2008, à 20:28

aleph

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

> KicheTof

Ok, je vois.

Pour la colorisation du flux de sortie pour une console que ce soit win ou*x, je n'ai pas d'expérience car je ne l'utilise pas, mais je sais qu'il existe des modules python pour cela.

Chercher conio.py sur google.

#70 Le 21/11/2008, à 12:07

KicheTof

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

Okay merci de l'info mais je ne vais pas me casser la tête pour de la couleur smile

ça va bien comme ça !

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


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

Hors ligne