1. Principe
Une expression régulière (ou regex) est un motif décrivant un ensemble de chaînes de caractères. On l’utilise pour tester, extraire ou remplacer du texte.
2. Les fonctions de R
| Fonction | Rôle | Exemple |
|---|---|---|
grepl(motif, x) | Vecteur de booléens : le motif est-il trouvé ? | grepl("[0-9]", c("a1","bc")) → TRUE FALSE |
sub(motif, rempl, x) | Remplace la première occurrence | sub("a","*","banane") → "b*nane" |
gsub(motif, rempl, x) | Remplace toutes les occurrences | gsub("a","*","banane") → "b*n*ne" |
regexpr(motif, x) | Position de la première occurrence (à combiner avec regmatches) | regmatches(x, regexpr("[0-9]+", x)) |
gregexpr(motif, x) | Positions de toutes les occurrences ; renvoie une liste | regmatches(x, gregexpr("[0-9]+", x)) |
regmatches(x, m) | Extrait les sous-chaînes repérées par regexpr / gregexpr | voir ci-dessus |
x <- c("Le 12/03/2024", "RDV le 5/4", "pas de date")
grepl("[0-9]+", x) # TRUE TRUE FALSE
sub("[0-9]+", "N", x) # "Le N/03/2024" "RDV le N/4" "pas de date"
gsub("[0-9]+", "N", x) # "Le N/N/N" "RDV le N/N" "pas de date"
regmatches(x, regexpr("[0-9]+", x)) # "12" "5" (les non-correspondances disparaissent)
regmatches(x, gregexpr("[0-9]+", x)) # list("12","03","2024") list("5","4") character(0)
3. Caractères spéciaux
| Motif | Signification | Exemple |
|---|---|---|
. | n’importe quel caractère | c.t : « cat », « cot »… |
^ / $ | début / fin de chaîne | ^a : commence par a ; s$ : finit par s |
[abc] | un caractère parmi a, b, c | [aeiou] : une voyelle |
[a-z], [0-9] | intervalle | [A-Za-z] : une lettre |
[^abc] | un caractère sauf a, b, c | [^0-9] : un non-chiffre |
\\d, \\w, \\s | chiffre, lettre/chiffre/_ , espace | \\d\\d : deux chiffres |
\\D, \\W, \\S | le contraire des précédents | |
\\b | frontière de mot | \\bchat\\b |
[[:alpha:]], [[:digit:]], [[:upper:]], [[:lower:]], [[:space:]], [[:punct:]] | classes POSIX (à écrire dans des crochets) | [[:punct:]] : ponctuation |
| | « ou » | chat|chien |
( ) | groupe (réutilisable avec \\1, \\2… dans le remplacement) | (ab)+ |
4. Quantificateurs
| Motif | Signification |
|---|---|
* | 0 fois ou plus |
+ | 1 fois ou plus |
? | 0 ou 1 fois (optionnel) |
{n} | exactement n fois |
{n,} | au moins n fois |
{n,m} | entre n et m fois |
Les quantificateurs sont « gourmands » : a.*b prend le plus long texte possible. Ajouter ? (ex. .*?, avec perl = TRUE) le rend « paresseux ».
5. Le piège de l’antislash dans R
Dans une chaîne R, l’antislash est déjà un caractère d’échappement. Pour que la regex reçoive
\d, on écrit "\\d". Pour un point littéral : "\\.". Pour un antislash littéral : "\\\\".| Regex voulue | Ce qu’on écrit en R |
|---|---|
\d+ | "\\d+" |
\.csv$ | "\\.csv$" |
\bchat\b | "\\bchat\\b" |
Alternative : dans un crochet, le point est littéral : [.]. Avec fixed = TRUE, le motif est lu comme un texte brut (aucun caractère spécial).
6. Remplacements et groupes
sub("^(\\w+) (\\w+)$", "\\2 \\1", "Marie Curie") # "Curie Marie"
gsub("([0-9]{2})/([0-9]{2})/([0-9]{4})", "\\3-\\2-\\1", "12/03/2024") # "2024-03-12"
7. Option perl = TRUE
Elle active les regex de type Perl : anticipations (?=...), (?!...), rétrospectives (?<=...), quantificateurs paresseux. Exemple : mot de passe contenant un chiffre et une majuscule :
grepl("^(?=.*[0-9])(?=.*[A-Z])", mdp, perl = TRUE)
8. Méthode
- Repérer ce qu’il faut trouver (lettres ? chiffres ? début/fin ? mot entier ?).
- Choisir la classe de caractères et le quantificateur.
- Ajouter les ancres (
^,$,\\b) si le motif doit couvrir toute la chaîne ou un mot entier. - Tester sur des cas limites (chaîne vide, absence de correspondance).