#51 Le 19/11/2008, à 12: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
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, à 13: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, à 13:39
- thierry2351
Re : [Résolu] Extraire morceau de texte dans une variable
Salut,
qq conseils qui peuvent (peut-être ) 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, à 14:27
- KicheTof
Re : [Résolu] Extraire morceau de texte dans une variable
Merci pour vos réponses, je vais tester ça !
Dernière modification par KicheTof (Le 19/11/2008, à 14:27)
Ubuntu Intrepid Ibex 64bit
Intel Core2Duo E6750 OC @ 3.52GHz - 4Gb DDR2 1066 - GeForce 7900GTO
Hors ligne
#55 Le 19/11/2008, à 14:53
- KicheTof
Re : [Résolu] Extraire morceau de texte dans une variable
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
Ubuntu Intrepid Ibex 64bit
Intel Core2Duo E6750 OC @ 3.52GHz - 4Gb DDR2 1066 - GeForce 7900GTO
Hors ligne
#56 Le 19/11/2008, à 21: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, à 22: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, à 08: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, à 09: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 !
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
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 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, à 10:00)
Ubuntu Intrepid Ibex 64bit
Intel Core2Duo E6750 OC @ 3.52GHz - 4Gb DDR2 1066 - GeForce 7900GTO
Hors ligne
#60 Le 20/11/2008, à 10: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, à 10: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
Effectivement c'est exactement ce que je voulais faire avec d'autre méthode plus longue
J'utilise la console avec mon script pour éviter de retapper sans cesse les lignes, donc je modifie juste dans mon script
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 !
Dernière modification par KicheTof (Le 20/11/2008, à 10:37)
Ubuntu Intrepid Ibex 64bit
Intel Core2Duo E6750 OC @ 3.52GHz - 4Gb DDR2 1066 - GeForce 7900GTO
Hors ligne
#62 Le 20/11/2008, à 11: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, à 11:25
- KicheTof
Re : [Résolu] Extraire morceau de texte dans une variable
Pardon faute de frappe, j'ai bien pris readlineS
Merci de l'info
Ubuntu Intrepid Ibex 64bit
Intel Core2Duo E6750 OC @ 3.52GHz - 4Gb DDR2 1066 - GeForce 7900GTO
Hors ligne
#64 Le 20/11/2008, à 11:53
- KicheTof
Re : [Résolu] Extraire morceau de texte dans une variable
j'ai finiiiiiiiiiiiiiiii
ça fonctionne parfaitement !
C'est peut-être pas très très propre, mais c'est pas grave, ça fonctionne
Un énorme merci à vous !
Dernière modification par KicheTof (Le 20/11/2008, à 11:53)
Ubuntu Intrepid Ibex 64bit
Intel Core2Duo E6750 OC @ 3.52GHz - 4Gb DDR2 1066 - GeForce 7900GTO
Hors ligne
#65 Le 20/11/2008, à 13: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
Hors ligne
#66 Le 20/11/2008, à 14:07
- KicheTof
Re : [Résolu] Extraire morceau de texte dans une variable
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 : [31mLes 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
Ubuntu Intrepid Ibex 64bit
Intel Core2Duo E6750 OC @ 3.52GHz - 4Gb DDR2 1066 - GeForce 7900GTO
Hors ligne
#67 Le 20/11/2008, à 15: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, à 16:42
- KicheTof
Re : [Résolu] Extraire morceau de texte dans une variable
Je parle de IDLE installé d'office avec python
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
Ubuntu Intrepid Ibex 64bit
Intel Core2Duo E6750 OC @ 3.52GHz - 4Gb DDR2 1066 - GeForce 7900GTO
Hors ligne
#69 Le 20/11/2008, à 19: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, à 11: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
ça va bien comme ça !
Dernière modification par KicheTof (Le 21/11/2008, à 11:23)
Ubuntu Intrepid Ibex 64bit
Intel Core2Duo E6750 OC @ 3.52GHz - 4Gb DDR2 1066 - GeForce 7900GTO
Hors ligne