extraire sous-chaines + module re

extraire sous-chaines + module re - Python - Programmation

Marsh Posté le 14-02-2004 à 19:27:42    

débutant sous python
j' ai des données à extraire dans des chaînes, j' ai regardé du coté du module 're', mais je bloques,  
 
j' ai une liste de chaînes ex:


modutils-2.4.25
texinfo-4.5
mpg123-0.59s-r1
development-sources-2.6.2


 
je veux seulement pouvoir récupérer le nom du package avec sa version à part.
 
Vous aurez sans doute compris que la difficulté c' est la possibilité d' avoir plusieurs '-' ou des sous-chaines 'rc' dans la version du soft.
 
juste un petit coup de main si vous voulez pas me donner la réponse, là j' avance plus. ( m' en faut pas beaucoup  :sweat: )

Reply

Marsh Posté le 14-02-2004 à 19:27:42   

Reply

Marsh Posté le 14-02-2004 à 23:25:49    

he ben j' ai trouvé un petit truc mais bon..
on se moque pas  :o  
 

Code :
  1. lst = ['modutils-2.4.25', 'development-sources-2.6.2', 'texinfo-4.5', 'mpg123-0.59s-r1']
  2. for elem in lst:
  3.     m = re.compile('-(\d+)')
  4.     a = m.split(elem)
  5.     print elem, a


 
ce qui donne ça :
 

modutils-2.4.25    ['modutils', '2', '.4.25']
development-sources-2.6.2    ['development-sources', '2', '.6.2']
texinfo-4.5    ['texinfo', '4', '.5']
mpg123-0.59s-r1    ['mpg123', '0', '.59s-r1']


 
c' est pas génial hein  :D  ?
j' ai vraiment du mal avec les regexp, j' aimes pas du tout  
personne pour un truc plus propre  :whistle:

Reply

Marsh Posté le 14-02-2004 à 23:53:43    

euh faut voir en fait, parce que si y a forcément un séparateur - entre la version et le nom, ça peut aller très vite
 
la vérité, c'est que les lettres dans les numéros de version foutent le bordel, je pense que c'est indécidable

Reply

Marsh Posté le 14-02-2004 à 23:55:08    

tu les choppes ou t'es données ?

Reply

Marsh Posté le 15-02-2004 à 00:05:44    

toutes ces données c' est des noms de dossiers qui représentent
tous mes packages installés.
 
alors par contre j' ai la possibilité de récupérer les noms(seulement) des packages qui sont dans un fichier,
 
mais pour la version je suis obligé de passer par ces dossiers.
 

Reply

Marsh Posté le 15-02-2004 à 00:07:47    

non je dis une bêtise, dans le fichier il y a pas tous les packages.
donc ça marche pas

Reply

Marsh Posté le 15-02-2004 à 00:08:55    

tu veux pas donner toutes les données du problèmes ? pourquoi, d'ou viennent les données, etc, avec toutes les précisions possible

Reply

Marsh Posté le 15-02-2004 à 00:18:38    

ok alors sous gentoo quand on installe un paquet il crée un dossier dans /var/db/pkg/X/ portant le nom du paquet.
ds ce dossier il y a juste quelques fichiers utiles pour portage
c' est tout.
 
Edit: X représente une catégorie.
 
 
alors ex: pour la catégorie app-admin pour l' instant j' ai 5 dossiers qui correspondent à ceux là
 

chkrootkit-0.41-r1
fam-2.7.0
gkrellm-2.1.24
pydf-0
syslog-ng-1.6.0_rc3-r1


 
le but c' est de pouvoir lister tous les paquets que j' ai installé sur ma machine par catégorie en donnant des informations notemment la version.
 
tu veux savoir quoi d' autre, désolé si je suis pas clair je fatigue.
 
merci de ton aide en tous les cas


Message édité par Profil supprimé le 15-02-2004 à 00:27:20
Reply

Marsh Posté le 15-02-2004 à 00:25:33    

donc pour récupérer ces données en fait je liste le contenu de  
/var/db/pkg/X/ pour chaque catégories.
 

Code :
  1. DB_PKGS = '/var/db/pkg/'
  2. def Cat_Installed():
  3.     """return une liste des différentes catégories de logiciels
  4.         installés sur le systèm."""
  5.    
  6.     cats = os.listdir(DB_PKGS)
  7.     cats.sort()
  8.     return cats
  9. def Soft_Installed(cat):
  10.     """return un dico ayant comme clès, les cats installées
  11.         et comme valeur une liste des logiciels installés faisant partis des cat"""
  12.    
  13.     dico = {}
  14.    
  15.     for elem in cat:
  16.         dico[elem] = os.listdir(DB_PKGS + elem)
  17.         # Si une catégorie ne contient aucun logiciels, on la supprime.
  18.         if not dico[elem]:
  19.             del dico[elem]
  20.    
  21.     # net-dialup': ['ppp-2.4.1-r14', 'rp-pppoe-3.5']
  22.     return dico


Reply

Marsh Posté le 15-02-2004 à 02:09:18    

Code :
  1. lst = ['modutils-2.4.25', 'development-sources-2.6.2', 'texinfo-4.5', 'mpg123-0.59s-r1']
  2. for elem in lst:
  3.     #m = re.search('(?<=-)\d+', elem)
  4.    
  5.     m = re.compile('-(\d.*$)')
  6.     a = m.search(elem)
  7.     print '%s    %s' % (a.group(1), elem)


 
ce qui donnes:
 

2.4.25    modutils-2.4.25
2.6.2    development-sources-2.6.2
4.5    texinfo-4.5
0.59s-r1    mpg123-0.59s-r1


 
ça à l' air d' etre bon
 
ça bloquerait par contre seulement si le nom du soft contiendrait
un tiret suivi de chiffres, ce qui est à mon avis assez rare, mais possible  [:airforceone]  
 
ex: to-69to
avec la version:
ex: to-69to-0.1
 
m' enfin bon ..  :sleep:

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed