Souvent, on ne souhaite pas uniquement savoir si un motif est présent dans un texte. On veut pouvoir réaliser des traitements supplémentaires, et il est alors utile de distinguer les groupes sémantiques du texte reconnu.
Par exemple, supposons que l'on ait construit une expression rationnelle pour relever l'entête d'un fichier html. On peut distinguer des groupes dans cette entête : le titre de la page, son encodage... Il est possible de récupérer les différentes valeurs de ces groupes à l'aide d'expressions rationnelles.
Les groupes sont définis à l'aide des méta-caractères ( et ), et ont deux utilisations pratiques : grouper des sous-expressions rationnelles, comme en mathématiques
>>> p = re.compile('(ab)*') >>> print p.match('ababababab').span() (0, 10)
Et permettre la récupération des chaînes reconnues par chaque sous-groupe, en les identifiant avec des numéros...
Il est possible de passer le numéro d'un sous-groupe aux méthodes group(), start(), end(), ou span().
Cette numérotation s'effectue ainsi :
>>> p = re.compile('(a(b)c)d')
>>> m = p.match('abcd')
>>> m.group(0)
'abcd'
>>> m.group(1)
'abc'
>>> m.group(2)
'b'
On peut passer plusieurs numéros à group() :
>>> m.group(2,1,2) ('b', 'abc', 'b')
Il est possible aussi de récupérer l'intégralité des sous-groupes, grâce à la méthode groups().
Cette dernière renvoie tous les sous-groupes, dans l'ordre, à partir du numéro 1 :
>>> m.groups() ('abc', 'b')
Dans une expression rationnelle, on peut faire référence au groupe n°i en échappant le i : \i.
Par exemple, si on souhaite extraire les mots qui se répètent, en se suivant, dans un texte, comme les « the » de la phrase « Paris in the the spring », on peut procéder comme suit :
L'expression rationnelle correspondant à nos vœux est donc :
r'(\b\w+)\s+\1'.
Dans ce qui précède, le \1 fait référence au sous-groupe n°1, c'est-à-dire au mot sensé se répéter. Et ça marche...
>>> p = re.compile(r'(\b\w+)\s+\1') >>> p.search('Paris in the the spring').group() 'the the'