Expressions Régulières en
Python3 et JavaScript

  les Expressions Régulières

les langages formels

Au cours des années 1940 se développe une théorie mathématique appelée théorie des langages formels. Un langage est défini comme un ensemble de «mots» qui s'articulent en «phrases» selon des règles, celle de sa «grammaire». Le problème essentiels des langages formels consiste à établir si une phrase respecte les règles de la grammaire, c'est-à-dire si sa «syntaxe» est correcte. Les langages informatiques (Fortran, Algol, Cobol etc) sont des langages formels. Il est donc naturel de voir la théorie mathématique s'appliquer à l'informatique.

Une partie seulement du transfert nous concerne ici. Il s'agit de ce qu'en anglais on appelle la théorie des «Regular Expressions», en abrégé «RegEx», mais en bon français, «Expressions Rationnelles» et par traduction littérale «Expressions Régulières». Elle relève de la théorie des automates, mais cela est une autre histoire.

la problématique

La problématique est la suivante : on dispose d'une chaîne de caractères, la chaîne d'étude, et d'une chaîne de caractère appelée Motif qui décrit tout une famille de chaînes possibles ; on recherche si la chaîne d'étude dans sa totalité se conforme (le mot technique : match) au schéma donné par le Motif. Un autre problème est de rechercher (le mot technique : search) si la chaîne contient des sous-chaînes qui se conforment au Motif. Par exemple, le Motif  "[a-z]+" décrit toute chaîne de caractère constituées uniquement des lettres minuscules de l'alphabet ; la chaîne "azerty" se conforme (match) au motif. Ce n'est pas le cas des chaînes "abcDefg", "abc efg", "abcde3" .

deux difficultés

L'application de cette problématique dans les langages présente deux difficultés :

- La première est liée à l'encodage des caractères. Pendant longtemps, l'utilisabilité des RegEx s'est engluée dans les questions d'encodage des chaînes. Des langages comme Java et JavaScript ont très tôt tranché pour l'Unicode ; il n'en est pas de même pour Python qui a attendu sa version 3 pour avoir des RegEx simples et performantes.
- La seconde est celui d'une représentation efficace d'un langage étranger (RegEx) à celui du codage (Python, JavaScript). La solution retenue est celle de la compilation des chaînes descriptives ; les motifs apparaissent alors comme de objets spécifiques au langage. C'est un peu lourd mais c'est puissant. Les deux dossiers qui suivent montrent des voies légèrement différentes utilisées en Python3 et JavaScript.

 

le module regex de Python

Le dossier ci-dessous s'applique à la version 3 de Python. Python a adopté dès le début les normes d'un module indépendant dit module POSIX. Mais jusque la version 2.7. Python a utilisé les codes ISO pour l'encodage ; ce choix malheureux a provoqué quantité de problèmes intéresants quant au travail sur les chaînes de caractères. La littérature Python reste encombrée de considérations qui deviennent obsolètes avec Python3 et son utilisation systématique de l'Unicode.

Il n'en reste pas moins que l'utilisation des Expressions Régulières nécessite un véritable apprentissage de ce langage et de son adaptation à Python. Mais dès que l'on a besoin de travailler sur des chaînes de caractères, l'outil se révèle puissant et sommes toutes assez simple en regard de l'élégance du code produit.

téléchargements

 format LibreOffice (3,3 Mio)  format P.D.F. (1,7 Mio)

utilisation des expressions régulières en JavaScript

Dès sa création, JavaScript a fait deux choix fondamentaux, qui malheureusement ont mis très longtemps à être reconnus:

- l'utilisation native de l'Unicode;
- l'insertion des expressions régulières au coeur du langage.

Les RegEx sont donc un élément constitutif du langage, au même titre que l'objet Math, Date, String, Boolean, Array etc. Penser en JavaScript, c'est donc disposer d'un outil de modélisation aussi disponible que les objets Array ou les objets String.

Le document qui suit est en fait un chapitre du dossier sur le langages JavaScript, qui a été isolé pour des raisons de disponiblité : il ne faut surtout pas le voir comme un modules ajouté au langage, comme cela est le cas en Python ou en Perl. Il n'empêche que la conception de l'approche JavaScript a une origne extérieure, et qu'elle constitue une adaptation qui n'a rien d'original d'un module préexistant. La norme actuelle se réfère au PCRE (Perl Compatible Regular Exression) également présent dans Perl, Apache, PHP, et qui n'a pas été sans influence sur Python.

téléchargements

 format LibreOffice (3,3 Mio)  format P.D.F. (1,7 Mio)