Jul 03, 2024

Wiki

Python

Aide

edit SideBar

Search

Correspondances Les Plus Petites Possibles


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>

Page Actions

Recent Changes

Group & Page

Back Links