Expressions régulières,  Linux,  Programmation,  Python

Expressions régulières première partie (sed, vim et python)

J’ai lu le livre «Sams Teach Yourself regular expressions in 10 Minutes» de Ben Forta. Celui-ci est une bonne introduction à des expressions régulières. Mais, à mon avis il y a des lacunes. D’abord, l’auteur ne parle pas de comment remplacer.

Ensuite, le livre est agnostic par rapport au language. J’ai dû adapter la syntaxe des expressions régulières aux commandes «sed» dans le terminal de Linux ainsi que l’editor Vim. Lorsqu’on se sert des expressions régulières en python, la syntaxe est encore différente.

Cela dit, les différences sont au niveau de syntaxe. Les règles de base sont pareilles.

Voici des exemples des différences entre l’éditeur de texte Vim, Sed et Python pour la même expression régulière:

Le but de l’expression est simplement d’ajouter le jour de la semaine à la date dans tout le document.  Le «&» indique répéter.

vim
%s/\v[> ]1 septembre 2018|[> ]8 septembre 2018|[> ]15 septembre 2018|[> ]22 septembre 2018|[> ]29 septembre 2018/dimanche&/g

Dans vim %s . . . /g indique que la Regex s’applique à tous les mots correspondants dans le document.

sed
sed ‘s/[> ]1 septembre 2018|[> ]8 septembre 2018|[> ]15 septembre 2018|[> ]22 septembre 2018|[> ]29 septembre 2018/dimanche&/g’

Python
D’abord, il faut ajouter le module re. Puis, créer une variable qui contient le texte. Ensuite, la méthode re.compile(r’) pour créer l’expression régulière. Le «r» est nécessaire pour éviter l’utilisation des caractères spéciaux (voir une explication: 1 Enfin, la méthode sub() pour faire le remplacement.  Voici qu’il faut taper dans l’interpréteur de Python:

date = « Barny le 1 décembre 2018 test date 8 décembre 2018 et le 2 décembre 2018 pas le 15 septembre 2018 »
>>> ajouter_jour_semaine1 = re.compile(r'([> ]1 décembre 2018|[> ]8 décembre 2018|[> ]15 décembre 2018|[> ]22 décembre 2018|[> ]29 décembre 2018)’)
>>> ajouter_jour_semaine1.sub(r’ samedi \1′, date)

Voici le résultat:
‘Barny le samedi 1 décembre 2018 test date samedi 8 décembre 2018 et le 2 décembre 2018 pas le 15 septembre 2018’

Dans la méthode sub(), le «\1» ajoute le groupe indiqué dans la méthode re.compile(), par exemple 1 décembre 2018, 8 décembre 2018, etc. Les parenthèses () indiquent la présence d’un groupe.2

  1. «What does the “r” in pythons re.compile(r’ pattern flags’) mean?» à https://stackoverflow.com/questions/21104476/what-does-the-r-in-pythons-re-compiler-pattern-flags-mean).
  2. Le livre «Automate the Boring Stuff with Python: Practical Programming for Total Beginners» d’Al SWEIGART le la vidéo «Python Tutorial: re Module – How to Write and Match Regular Expressions (Regex)» de Corey SCHAFER à https://www.youtube.com/watch?v=K8L6KVGG-7o&t=33s expliquent bien comment à faire des des expressions régulières dans Python.

Programmation, science de données et marketing