• Menu
    • Nos Formations
    • Nos Prestations
    • Les Astuces
Skip to content
Astuces et scripts R
Astuces et scripts R
Primary Navigation Menu
Menu
  • Abcd’R
  • Tous les scripts
    • Voir les articles
    • Proposer un Article
  • Formation au logiciel R
  • Contact

Les dates de formations à R, éligibles au CPF sont en lignes !

Voir nos formations

Comment extraire un motif d’une chaîne de caractères avec une expression régulière ou regex

Par Antoine Languillaume
Le octobre 21, 2021
Dans base indispensable, chaines de caractères, tidyverse
Tagged regex, stringr
Avec 0 Commentaire

Analyser des données demande de savoir manipuler aussi du texte. Ce que nous appelons texte en tant qu’humain est interprété par R comme une chaîne de caractères.

Le type de donnée correspondant dans R est appelé: character.

class("abcdR")
## [1] "character"

Il est parfois nécessaire d’extraire des motifs particuliers de chaînes de caractères. Pour ce faire on peut utiliser des expressions régulières ou regex en anglais.

Pour cela nous allons utiliser {stringr}, un package du tidyverse.

library(stringr)

Considérons un vecteur de noms de fichiers csv.

noms_fichiers <- c("pop_FRA_2019.csv", "pop_ITA_2020.csv", "pop_ESP_2019.csv")

Comment extraire le code iso3 (FRA, ITA…) ?

str_extract(string = noms_fichiers, pattern = "[A-Z]{3}")
## [1] "FRA" "ITA" "ESP"

Ici le motif (pattern) à extraire correspond à une lettre majuscule [A-Z] répétée exactement {3} fois. Facile !

Mais malheureusement la vie n’est jamais aussi simple…

noms_fichiers <- c("pop_fra_2019.csv", "pop_ita_2020.csv", "pop_esp_2019.csv")

Dans ce cas précis notre exemple précédent ne fonctionne plus car tout est en minuscule. Nous devrions utiliser la version minuscule du pattern: "[a-z]{3}", une lettre minuscule [a-z] répétée exactement {3} fois. Mais cela ne correspond plus à un motif unique.

str_extract(noms_fichiers, "[a-z]{3}")
## [1] "pop" "pop" "pop"

Il est alors nécessaire de sortir l’artillerie lourde…

str_extract(noms_fichiers, "(?<=pop_)[a-z]{3}(?=_\\d{4})")
## [1] "fra" "ita" "esp"

Ce motif, "(?<=pop_)[a-z]{3}(?=_\\d{4})" se lit,

  • (?<=pop_), ce qui est précédé (?<=) par pop_.
  • "[a-z]{3}", une lettre minuscule [A-Z] répétée exactement {3}.
  • (?=_\\d{4}), ce qui est suivi (?=) par un chiffre \\d répété exactement {4} fois.

Pour être totalement rigoureux, on peut rajouter:

str_extract(noms_fichiers, "(?<=^pop_)[a-z]{3}(?=_\\d{4}\\.csv$)")
## [1] "fra" "ita" "esp"
  • ^ commence par pop_.
  • \\.csv se termine $ par l’extension “point” \\., csv.

Il est parfois complexe d’utiliser ce genre de symboles appelés lookarounds, (?=) et (?<=). Une alternative plus simple est de tirer profit de la notion de groupe.

En regex on définit un groupe en utilisant des parenthèses.

str_replace(
  string = noms_fichiers, 
  pattern = "^pop_([a-z]{3})_\\d{4}\\.csv$",
  replacement = "\\1"
)
## [1] "fra" "ita" "esp"

Ici on définit le motif complet en rajoutant des parenthèses autour du motif à extraire: ([a-z]{3}). On demande à str_replace() de remplacer la chaîne complète par le premier groupe définit (le seul et l’unique) avec \\1.

Et voilà, les regex sont une technique difficile à appréhender pour les débutants mais ô combien utile à celles ou ceux qui la maîtrisent.

Pour en savoir plus:

  • cheatsheet {stringr}
  • Article « R et les expressions régulières »
2021-10-21
Article précédent: Comment lire un fichier raster dans R ?
Article suivant: Ajouter des labels et des titres dans ggplot2

Formation et consultance

Trouvez votre formation R sur-mesure chez ThinkR

-- Contactez-nous --

Catégories

Commentaires récents

  • Sébastien dans Comment effectuer des calculs de somme et de moyenne sur les colonnes ou les lignes d’une matrice ? colSums, rowSums, colMeans, rowMeans
  • Achraf Mazouz dans Comment effectuer des calculs de somme et de moyenne sur les colonnes ou les lignes d’une matrice ? colSums, rowSums, colMeans, rowMeans
  • Lou Sayd dans Coment alculer simplement la SEM dans R ? (Erreur Standard)
  • Nicolas dans Comment remplacer une chaîne de caractères ? string_replace_all(df, "pattern","replacement")
  • Vincent dans Comment comparer deux moyennes avec R grâce au test de Student ? t.test

Archives

Plan

  • Abcd’R
  • Tous les scripts
    • Proposer un Article
  • Ressources documentaires
    • Le logiciel R
    • Liste des interfaces graphiques
  • Formation au logiciel R
  • Contact
  • Politique de confidentialité

Flux ThinkR – Certification & Formation langage R

  • Déboguer une fonction avec debugonce() ou browser()
  • Dessinez pour gagner : L’impact des maquettes sur vos apps Shiny
  • Gérer et manipuler des dates en 2024 : une année pas comme les autres !
  • Retour vers le turfu : R, le web, et webR
  • Créer un package R et le versionner avec VSCode ? Mission possible !

Méta

  • Connexion
  • Flux des publications
  • Flux des commentaires
  • Site de WordPress-FR

ABCD'R (par ThinkR ) © 2025 - Confidentialité