Jul 03, 2024

Wiki

Python

Aide

edit SideBar

Search

Utilisation Des Expressions Compilees


Une fois l'expression rationnelle compilée, il faut l'utiliser.

Méthodes des expressions compilées

Les instances RegexObject possèdent diverses méthodes, dont :

match()
Regarde si l'expression rationnelle correspond au début de la chaîne.
search()
Recherche l'expression rationnelle dans toute la chaîne.
findall()
Renvoie la liste de toutes les sous-chaînes qui vérifient le motif.
finditer()
Comme ci-dessus, sauf que le retour n'est pas une liste, mais un itérateur.

Les deux premières méthodes renvoient :

  • None si l'expression n'a pas été trouvée,
  • un objet MatchObject sinon, qui contient toutes les informations nécessaires : sous-chaîne reconnue, début et fin de la reconnaissance, etc.

Donnons quelques exemples :

  >>> import re
  >>> p = re.compile('[a-z]+')
  >>> p
  <_sre.SRE_Pattern object at 80c3c28>
  >>> p.match("")
  >>> print p.match("")
  None
  >>> m = p.match( 'tempo')
  >>> print m
  <_sre.SRE_Match object at 80c4f68>

Méthodes des MatchObjects

Quand on a un objet MatchObjects, i.e. qu'un motif a été trouvé, les méthodes suivantes peuvent s'appliquer :

group()
Renvoie la sous-chaîne reconnue.
start()
Renvoie le début de la reconnaissance (sa position).
end()
Renvoie la fin de la reconnaissance.
span()
Renvoie le couple (début, fin).

Reprenons l'exemple ci-dessus :

  >>> import re
  >>> p = re.compile('[a-z]+')
  >>> m = p.match( 'tempo')
  >>> m.group()
  'tempo'
  >>> m.start(), m.end()
  (0, 5)
  >>> m.span()
  (0, 5)

Match et search

La méthode match de la classe RegexObject ne vérifie, on le rappelle, la présence du motif qu'au début de la chaîne. Ainsi, si une correspondance a été trouvée, et qu'un objet MatchObjects a donc été créé, la méthode start() de cet objet renverra toujours 0.

Cela n'est pas le cas pour la méthode RegexObject.search(), qui recherche des correspondances dans toute la chaîne :

  >>> import re
  >>> p = re.compile('[a-z]+')
  >>> print p.match('::: message')
  None
  >>> m = p.search('::: message') ; print m
  <re.MatchObject instance at 80c9650>
  >>> m.group()
  'message'
  >>> m.span()
  (4, 11)

Utilisation pratique

Voici un canevas d'utilisation de ce qui précède :

  • on stocke l'expression compilée dans une variable,
  • on lui applique la méthode match, ou search, et l'on stocke le résultat dans une variable,
  • si cette variable est None, on signale qu'aucune correspondance ne convient,
  • sinon, on effectue le traitement...
  >>> p = re.compile( r'expression rationnelle' )
>>> m = p.match( 'Chaine à scanner' )
  >>> if m:
  ...    print 'Correspondance trouvée : ', m.group()
  ... else:
  ...    print 'Aucune correspondance.'

findall() et finditer()

Pour finir cette partie, donnons des exemples d'utilisation des méthodes findall() et finditer().

findall() renvoie la liste des correspondances trouvées...

  >>> p = re.compile('\d+')
  >>> p.findall('12 drummers drumming, 11 pipers piping, 10 lords a-leaping')
  ['12', '11', '10']

findall() doit donc trouver toutes les correspondances, avant de retourner leur liste, ce qui peut poser problème : prendre du temps, encombrer la mémoire, renvoyer un objet trop grand pour être exploitable...

Si cela pose problème, on peut utiliser la méthode finditer() qui renvoie la suite des correspondances au travers d'un iterateur :

  >>> iterateur = p.finditer('12 drummers drumming, 11 ... 10 ...')
  >>> iterateur
  <callable-iterator object at 0x401833ac>
  >>> for correspondance in iterateur:
  ...     print correspondance.span()
  ...
  (0, 2)
  (22, 24)
  (29, 31)

Page Actions

Recent Changes

Group & Page

Back Links