OVH Cloud OVH Cloud

Regex pour extrair des identifiants.

4 réponses
Avatar
Bob
Bonjour,

Je galère avec les Regex.

Je me trouves avec un identifiant et une description d'objets.
Ils sont de la forme :

IDObjet("2K46553");
DescObjet("Descrition 2 de l objet");

Je voudrais extraire les information ID et description.

Mais avec re et search je galère pas mal....

Merci !

Bertrand

4 réponses

Avatar
Alexandre Fayolle
Le 04-05-2006, Bob nous disait:
Bonjour,

Je galère avec les Regex.

Je me trouves avec un identifiant et une description d'objets.
Ils sont de la forme :

IDObjet("2K46553");
DescObjet("Descrition 2 de l objet");

Je voudrais extraire les information ID et description.

Mais avec re et search je galère pas mal....


Ca peut se faire avec des expressions régulières, par exemple quelque
chose comme:

m= re.search(r'IDObjet("(?P<id>[^"]*)");', s)
print m.group('id')

Mais c'est pas forcément le plus facile à maintenir. Les fonctions de
manipulation de chaînes de caractère en python sont très puissantes, et
on peut faire plein de choses astucieuses.

lines = s.split('n')
identifiants = []
descriptions = []
for line in lines:
line = line.lstrip()
if line.startswith('IDObjet'):
identifiants.append( get_quoted(line))
elif line.startswith('DescObjet'):
descriptions.append(get_quoted(line))
else:
continue

def get_quoted(line):
first_quote = line.index('"') + 1
last_quote = line.rindex('"')
return line[first_quote:last_quote]

On peut ensuite complexifier en fonction du degré de robustesse qu'on
souhaite obtenir, c'est-à-dire le degré de variations qu'on souhaite
accepter dans le format d'entrée: comme d'habitude, il convient d'être
rigoureux dans ce qu'on produit, et flexible dans ce qu'on accepte comme
entrées...



--
Alexandre Fayolle LOGILAB, Paris (France)
Formations Python, Zope, Plone, Debian: http://www.logilab.fr/formations
Développement logiciel sur mesure: http://www.logilab.fr/services
Python et calcul scientifique: http://www.logilab.fr/science

Avatar
Eric Deveaud
Bob wrote:
Bonjour,

Je galère avec les Regex.

Je me trouves avec un identifiant et une description d'objets.
Ils sont de la forme :

IDObjet("2K46553");
DescObjet("Descrition 2 de l objet");


aparement tu as pour les ID et la description une chaine alphanumerique.

de plus tu as 2 ancres de part et d'autres constantes
pour les ID
on a partie constante: IDObjet(" et ");
partie variable: quelque chose d'alphanumerique de taille au moin 1 non
la taille de la chaine ID est-elle fixée ??

je soumetrais a premiere vue un truc du genre
pattern_ID = '^IDObjet("(?P<ID>(w).+)");$'

pour les descriptions idem
partie constante: DescObjet(" et ");
partie variable: quelque chose d'alphanumerique de taille au moin 1 non
pattern_DESC= '^DescObjet("(?P<DESC>(w| ).+)");$'

Je voudrais extraire les information ID et description.


import re

s1 = 'IDObjet("2K46553");'
s2 = 'DescObjet("Descrition 2 de l objet");'

pattern_ID = '^IDObjet("(?P<ID>(w).+)");$'
auto = re.compile(pattern_ID)
m = auto.match(s1)
if m is not None:
id = m.group('ID')
print id

pattern_DESC= '^DescObjet("(?P<DESC>(w| ).+)");$'
auto = re.compile(pattern_DESC)
m = auto.match(s2)
if m is not None:
desc = m.group('DESC')
print desc


Eric

Avatar
Bertrand
Ca march e!!


Merci bcoup !


Bob wrote:
Bonjour,

Je galère avec les Regex.

Je me trouves avec un identifiant et une description d'objets.
Ils sont de la forme :

IDObjet("2K46553");
DescObjet("Descrition 2 de l objet");


aparement tu as pour les ID et la description une chaine alphanumerique.

de plus tu as 2 ancres de part et d'autres constantes
pour les ID
on a partie constante: IDObjet(" et ");
partie variable: quelque chose d'alphanumerique de taille au moin 1 non
la taille de la chaine ID est-elle fixée ??

je soumetrais a premiere vue un truc du genre
pattern_ID = '^IDObjet("(?P<ID>(w).+)");$'

pour les descriptions idem
partie constante: DescObjet(" et ");
partie variable: quelque chose d'alphanumerique de taille au moin 1 non
pattern_DESC= '^DescObjet("(?P<DESC>(w| ).+)");$'

Je voudrais extraire les information ID et description.


import re

s1 = 'IDObjet("2K46553");'
s2 = 'DescObjet("Descrition 2 de l objet");'

pattern_ID = '^IDObjet("(?P<ID>(w).+)");$'
auto = re.compile(pattern_ID)
m = auto.match(s1)
if m is not None:
id = m.group('ID')
print id

pattern_DESC= '^DescObjet("(?P<DESC>(w| ).+)");$'
auto = re.compile(pattern_DESC)
m = auto.match(s2)
if m is not None:
desc = m.group('DESC')
print desc


Eric



Avatar
Cémoi
<snip>
Je voudrais extraire les information ID et description.



import re

s1 = 'IDObjet("2K46553");'
s2 = 'DescObjet("Descrition 2 de l objet");'

pattern_ID = '^IDObjet("(?P<ID>(w).+)");$'
auto = re.compile(pattern_ID)
m = auto.match(s1)
if m is not None:
id = m.group('ID')
print id

pattern_DESC= '^DescObjet("(?P<DESC>(w| ).+)");$'
auto = re.compile(pattern_DESC)
m = auto.match(s2)
if m is not None:
desc = m.group('DESC')
print desc


On peut aussi définir un motif de maniere bavarde: c'est plus facile à
lire et donc à maintenir.
Je n'ai récrit que pour IDObjet:

import re

s1 = 'IDObjet("2K46553");'

pattern_ID = """
^ # debut de chaine
IDObjet # motif 'IDobjet'
(" # a partir de parenthese ouvrante + guillemet,
(?P<ID>(w).+) # capture le mot avec un identifiant 'ID',
"); # jusqu'au guillemet + parenthese fermante
$ # suivi d'une fin de ligne
"""
auto = re.compile(pattern_ID, re.VERBOSE)
m = auto.match(s1)
if m is not None:
id = m.group('ID') # recupere le groupe 'ID'
print id

Laurent

P.S.: tu peux jeter un oeil ici, il y a des infos utiles:
http://diveintopython.adrahon.org/regular_expressions/index.html



Eric