Jul 03, 2024

Wiki

Python

Aide

edit SideBar

Search

Premier Exemple


Le problème

On donne, dans ce qui suit, un premier exemple concret d'utilisation d'expressions rationnelles, tiré de dive into Python.

L'auteur de cette page a eu besoin de standardiser des adresses postales, pour réussir une importation, et a dû remplacer les ROAD en RD.. On précise que toutes les adresses ont été mises en majuscule.

Réalisation à la main

La première idée que l'on pourrait avoir est d'utiliser la méthode replace :

  >>> s = '100 NORTH MAIN ROAD'
  >>> s.replace('ROAD', 'RD.')
  '100 NORTH MAIN RD.'

Seulement, cette méthode traite mal l'adresse 100 NORTH BROAD ROAD :

  >>> s = '100 NORTH BROAD ROAD'
  >>> s.replace('ROAD', 'RD.')
  '100 NORTH BRD. RD.'

On pourrait souhaiter adapter cette méthode, en bidouillant un peu. Par exemple, on peut ne remplacer ROAD par RD. que si cette sous-chaîne constitue les 4 derniers caractères de l'adresse considérée :

  >>> s[:-4] + s[-4:].replace('ROAD', 'RD.')
  '100 NORTH BROAD RD.'

Dans ce qui précède,

  • on concatène (+)...
  • les premiers caractères (s[:-4], soit la tranche des caractères situés du début jusqu'au 4ième avant la fin),
  • aux 4 derniers (s[-4:], soit du caractère en position 4 en partant de la droite, et jusqu'à la fin) remplacés si besoin.

Cette méthode suppose que ROAD n'apparaît qu'à l'exacte fin d'une ligne. Et elle ne s'adaptera pas facilement, pour changer STREET en ST. par exemple, vu qu'on fait explicitement référence à la taille de ROAD.

Tout cela commence donc à être assez lourde.

Utilisation d'expressions rationnelles

Il est temps de recourir aux expressions régulières.

En Python, toutes les fonctionalités en rapport aux expressions régulières sont contenues dans le module re :

  >>> import re

Dire que l'on souhaite ne remplacer ROAD par RD. que s'il est en fin de la chaîne, se fait alors simplement, avec la fonction sub (substitution) :

  >>> s = '100 NORTH BROAD ROAD'
  >>> re.sub('ROAD$', 'RD.', s)
  '100 NORTH BROAD RD.'

L'expression régulière 'ROAD\$' ci-dessus signifie «ROAD que s'il est à la fin de la chaîne», vu que le symbole \$ signifie «fin de la chaîne». Signalons que l'accent circonflexe ^ est l'équivalent de \$ pour «début de la chaîne».

Vers de nouvelles expressions

Dans la base à importer, certaines rues ne portent pas le mot-clé ROAD.

Ainsi, il y a le risque de rencontrer 100 NORTH BROAD, et la technique ci-dessus est mise en défaut :

  >>> s = '100 NORTH BROAD'
  >>> re.sub('ROAD$', 'RD.', s)
  '100 NORTH BRD.'

Finalement on souhaite reconnaitre ROAD :

  • s'il est à la fin de la chaîne,
  • s'il est un mot isolé.

Pour cela, on utilise \b, qui signifie : «une limite de mot doit apparaître ici».

Seulement, en Python, le backslash \ est le caractère d'échappement. Il faut donc l'échapper lui aussi, en le doublant :

  >>> s = '100 NORTH BROAD'
  >>> re.sub('\\bROAD$', 'RD.', s)
  '100 NORTH BROAD'
  >>> s = '100 NORTH BROAD ROAD'
  >>> re.sub('\\bROAD$', 'RD.', s)
  '100 NORTH BROAD RD.'

Ou en précisant que la chaîne doit être considérée comme une chaîne brute, en la précédant d'un r (raw):

  >>> s = '100 NORTH BROAD'
  >>> re.sub(r'\bROAD$', 'RD.', s)
  '100 NORTH BROAD'

Un dernier problème

Il reste un dernier problème à régler : l'adresse peut se terminer par le numéro d'appartement. Auquel cas, le ROAD à changer en RD. n'est plus forcément en fin de chaîne, et le \$ ne convient plus.

Finalement, le problème se résout ainsi : on remplace ROAD par RD. que si ce mot est isolé dans la chaîne :

  >>> s = '100 NORTH BROAD ROAD APT. 3'
  >>> re.sub(r'\bROAD\b', 'RD.', s)
  '100 NORTH BROAD RD. APT. 3'

Page Actions

Recent Changes

Group & Page

Back Links