Considérons le cas où l'on souhaite capturer tout ce qu'il y a entre deux caractères données. Par exemple, on souhaite récupérer les balises html contenues dans un texte, c'est-à-dire tout ce qui se situe entre < et >.
On peut être tenté d'utiliser le motif <.*>, à savoir : « le caractère <, suivi d'un nombre quelconque de caractères autres que \n, suivi de > ».
Cependant, avec ce motif, le moteur ne trouve pas quatre basiles dans <html><head><title>Title</title>, mais une seule de longueur 32 :
>>> s = '<html><head><title>Title</title>' >>> len(s) 32 >>> print re.match('<.*>', s).span() (0, 32) >>> print re.match('<.*>', s).group() <html><head><title>Title</title>
Cela vient du fait que, lors de l'utilisation d'un joker dans une expression rationnelle, comme dans .*, le plus grand nombre possible de caractères est consommé.
Pour répondre à ce genre de problèmes, il faut utiliser un des métacaractères suivants : *?, +?
, ??, ou {m,n}?, qui signifient que le motif relevé (par *, +, ? ou {m;n}) doit être le plus petit possible.
La solution au problème est donc :
>>> print re.match('<.*?>', s).group() <html>