Utilisation des expressions régulières sous R

Sommaire
- Résumé
- Intérêt, Pré-requis
- Préambule
- Base des expressions régulières
- Quelques exemples
- Expression régulière dans R
- Référence bibliographique
Résumé

L'expression régulière est considéré comme un outil idéal pour manipuler les textes tels que par exemples localiser ou extraire une partie d'un document.  Cette fiche va vous montrer comment utiliser cet outil sous R.

Intérêt
Outil "simple" et puissant.
Pré-requis
Avoir une notion de base de la programmation.

Préambule

A l'heure actuelle, il existe  deux normes des expressions régulières dont la syntaxe diffère très légèrement: POSIX étendue et Perl compatible. R utilise  la norme POSIX étendue par défaut. Pour utiliser la norme Perl, il faut positionner l'argument perl=TRUE dans l'utilisation des fonctions concernées.  Dans la suite de cette fiche, nous utiliserons surtout la norme POSIX étendue. Toutefois,  la syntaxe de la norme Perl sera donnée entre parenthèse si celle-ci s'avère différente.

Base des expressions régulières


Les métacaractères constituent la base d'une expression régulière. Il s'agit des symboles utilisés pour désigner un ou plusieurs caractères. Par exemple, ? est un métacaractère qui indique que la caractère précédant ? est optionnel. Donc, l'expression régulière MIAJ? est vrai à la fois pour MIA et MIAJ. Pour neutraliser un métacaractère, il suffit de mettre \ devant le métacaractère. Par exemple, MIA\? donne MIA?.
Métacaractères Signification
[...] un des caractères indiqués entre les crochets. Par exemple, [ABC] donne A, B , C.
[^...] tous les caractères sauf ceux indiqués après le ^. Par exemple, [^A]BC donne BBC, CBC, etc.
[x-y] les caractères compris entre x à y inclus. Par exemple, [A-C] donne A, B, C.
[:alnum:] équivalent à a-zA-Z0-9 avec en plus les caractères spéciaux que l'on retrouve suivant les langues utilisées comme les éèùçà. Par exemple, A,B,C, 0, 1, etc.
[:alpha:] équivalent à a-zA-Z avec en plus les caractères spéciaux que l'on retrouve suivant les langues utilisées.
[:digit:] équivalent à 0-9.
[:lower:] équivalent à a-z avec en plus les caractères spéciaux que l'on retrouve suivant les langues utilisées.
[:upper:] équivalent à A-Z avec en plus les caractères spéciaux que l'on retrouve suivant les langues utilisées comme les ÂÛÔ...
[:xdigit:] équivalent à 0-9a-fA-F.
[:graph:] tout caractère graphique.
[:print:] tout caractère affichable.
[:punct:] tout caractère de ponctuation.
[:blank:] espace, tabulation.
[:space:] espace, tabulation, nouvelle ligne, retour chariot.
[:cntrl:] tout caractère de contrôle.
. n'importe quel caractère.
^ en dehors du crochet, indique le début du texte. Par exemple, ^WIN localise le "WIN" dans "Windows", mais non le "WIN" dans "MS Windows".
$ en fin de motif, indique  la fin du texte.
+ 1 ou plusieurs occurences du motif qui précède le +.
* 0 ou plusieurs occurences du motif qui précède le *.
? 0 ou 1 occurence du motif précédant du ?.
{n} n occurences du motif qui précède. Par exemple, [A-C]{2} donne AA, AB, AC, BB, BA, BC, etc.
{x,} x ou plus occurences du motif qui précède.
{,y} y occurences au plus du motif qui précède.
{x,y} x à y occurences  du motif qui précède.
(...) définition d'une sous-expression. Par exemple, pa(pa)? donne pa, papa.
\N Référence en arrière. N est un chiffre pouvant aller de 1 à 9 pour désigner les sous-expressions précédents. \1 correspond à la dernière sous-expression, \2 l'avant dernière expression. Par exemple, (pa|ba)\1 donne papa, baba
| alternative. Par exemple, (pa|ba) donne pa, ba
\b expression Perl, indique le début ou la fin d'un mot.
\B expression Perl, indique ni le début ni la fin d'un mot.
\d expression Perl, équivalent à [0-9] dans POSIX.
\D expression Perl, équivalent à [^0-9] dans POSIX.
\n expression Perl, indique une nouvelle ligne.
\r expression Perl, indique le retour chariot.
\t expression Perl, indique la tabulation.
\s expression Perl, équivalent à [:space:] dans POSIX.
\S expression Perl, équivalent à [^[:space:]] dans POSIX.
\w expression Perl, équivalent à [:alnum] dans POSIX.
\W expression Perl, équivalent à [^[:alnum:]] dans POSIX.

Quelques exemples


Prenons deux exemples de texte: Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt) et Mozilla/4.75 [en] (X11;U;Linux2.2.16-22 i586). Nous les nommons respectivement STRING1 et STRING2. Voici quelques expressions régulières ainsi que les résultats de recherche dans STRING1 et STRING2. T signifie VRAI et indique que le motif défini dans l'expression régulière a été retrouvé; F signifie FAUX et indique que le motif n'a pas été retrouvé.

Expression Régulière STRING1

STRING2

m T,  "m" dans "compatible" F
a/4 T, "a/4" dans "Mozilla/4.0" T
5 [ F T, "5 [" dans "4.75 [en]"
in[du] T,  "ind" dans "windows" T, "inu" dans "Linux"
x[0-9A-Z] F, le "t" est minuscule dans "xt" T, "x2" dans "Linux2"
[^A-M]in T, "Win" dans "Windows" F
[a-z]\($ T, "t)" dans "DigiExt)" à la fin du texte. F
\(.*e T, matche avec "(compatible". F
W*in T, "Win" dans "Windows" T, "in" dans "Linux"
[xX][0-9a-z]{2} F T, "X11" dans "X11;U"
^([L-Z]in) F, "Win" ne débute pas le texte. F, "Lin" n'est pas au début du texte.
((4\.[0-3])|(2\.[0-3])) T, "4.0 dans "Mozilla/4.0" T, "2.2" dans "Linux2.2"

Expression régulière dans R

 
Les fonctions R dans lesquelles on utilise les expressions régulières le plus souvent  sont:
  1. la localisation de texte: grep, grepl, regexpr, gregexpr.
  2. la substitution de texte: sub, gsub.
  3. le découpage de texte: strsplit.

Par défaut, R utilise la norme POSIX étendue. Pour que R parse le texte selon la norme Perl, il faut, dans les commandes concernées, positionner l'argument perl = TRUE.

Pour que le parseur des expressions régulières de R puisse interpréter correctement les méta-caractères commençant avec un " \", il faut le remplacer par un double anti-slash "\\".

Ci-dessous, on va donner quelques exemples d'utilisation des expressions régulières en R à travers les commandes: grep, sub et strsplit.

  • Quels sont les mots en alphabétique  qui commencent par un "f" et finissent par un "t"?
txt <- c("arm","fot", "foot","lefroot", "footbart")
grep("^f[[:alpha:]]*t$", txt) ## Result: 2, 3, 5

  • Quels sont les mots en 3 lettres qui commencent par un "f" et finissent par un "t"?
txt <- c("arm","fot", "foot","lefroot", "footbart")
grep("^f[[:alpha:]]t$", txt) ## Result: 2


  •  Comment remplacer les espaces multiples par un seul?
txt<-'Now    is the time!      '
gsub('[[:space:]]+', ' ', txt) ## 'Result: Now is the time! '


  •  Comment supprimer les espaces à la fin d'une phrase?
txt<-'Now is     the time!      '
gsub('[[:space:]]+$', '', txt) ##  Result: Now is      the time!

  •  Comment récupérer le vecteur des mots contenus dans une phrase?
txt<-'Now, it\'s    time ...'
strsplit(txt, '[[:space:],.!?\']+$') ##  Result: "Now" "it" "s" "time"



Références