Manipulation de chaînes de caractères avec stringr

January 3, 2011
By

This post was kindly contributed by Alea - R - go there to comment and to read the full post.

L'extension stringr, développée par Hadley Wickham, propose une interface unifiée et simplifiée à différentes fonctions de manipulations des chaînes de caractères.

Les fonctionnalités proposées sont notamment :

  • des noms de fonctions harmonisés et cohérents, commençant tous par le préfixe str_
  • une simplification des arguments : valeur par défaut plus pratique, suppression des arguments rarement utilisés
  • traitement des variables de type factor de la même manière les variables de type character

L'extension s'installe via :

install.packages("stringr", dependencies=TRUE)

Pour l'utiliser :

library(stringr)

Fonctions de base

Concaténation : str_c

Équivalent de paste, mais le séparateur par défaut est une chaîne vide au lieu d'un espace.

paste("a", "b")
[1] "a b"
str_c("a", "b")
[1] "ab"

Longueur d'une chaîne : str_length

Équivalent de nchar :

nchar("abc")
nchar(factor("abc"))
nchar(NA)
[1] 3
[1] 1
[1] 2
str_length("abc")
str_length(factor("abc"))
str_length(NA)
[1] 3
[1] 3
[1] NA

Extraction d'une sous-chaîne : str_sub

Équivalent de substr. Elle accepte des arguments de position négatifs, qui comptent en partant de la fin de la chaîne :

str_sub("abcdef", 1, 3)
str_sub("abcdef", 4)
str_sub("abcdef", -1)
[1] "abc"
[1] "def"
[1] "f"

Remplacement d'une sous-chaîne : str_sub<-

Équivalent de substr<-, avec les mêmes améliorations que pour la fonction précédente :

x <- "abcdef"
str_sub(x, 1, 3) <- "aaa"
x
aaadef

Suppression des espaces en début et fin : str_trim

str_trim("  abc    ")
[1] "abc"

Autres fonctions

  • str_dup permet de dupliquer des chaînes
  • str_pad permet de compléter une chaîne de caractères avec des espaces en début et/ou fin

Expressions régulières

Détecter la présence d'un motif : str_detect

str_detect renvoie un vecteur logique indiquant si le motif a été repéré pour chaque élément d'un vecteur :

ch <- c("M. patate", "brocolis patissiers", "patates patissieres")
str_detect(ch, "patate")

[1]  TRUE FALSE  TRUE
str_detect(ch, "^patate")
[1] FALSE FALSE  TRUE

Localiser un motif : str_locate

str_locate renvoie les positions de la première occurrence d'un motif dans chaque élément d'un vecteur :

str_locate(ch, "patiss.*r")
     start end
[1,]    NA  NA
[2,]    10  18
[3,]     9  17

str_locate_all renvoie les positions de toutes les occurrences du motif :

str_locate_all(ch, "pat")
[[1]]
     start end
[1,]     4   6

[[2]]
     start end
[1,]    10  12

[[3]]
     start end
[1,]     1   3
[2,]     9  11

Extraire un motif : str_extract

Fonctionne de la même manière que str_locate mais renvoit le texte correspondant au motif plutôt que la position :

str_extract(ch, "pat.")
[1] "pata" "pati" "pata"
str_extract_all(ch, "pat.")
[[1]]
[1] "pata"

[[2]]
[1] "pati"

[[3]]
[1] "pata" "pati"

Matching : str_match

str_match fonctionne comme str_extract mais permet de différencier les groupements. La fonction renvoit une matrice dont la première colonne est l'extraction de la motif dans son ensemble, et les colonnes suivantes l'extraction de chaque groupe :

str_match(ch, "(.*) (patissier.*)$")
     [,1]                  [,2]       [,3]         
[1,] NA                    NA         NA           
[2,] "brocolis patissiers" "brocolis" "patissiers" 
[3,] "patates patissieres" "patates"  "patissieres"
str_match_all(ch, "pat(...)")
[[1]]
     [,1]     [,2] 
[1,] "patate" "ate"

[[2]]
     [,1]     [,2] 
[1,] "patiss" "iss"

[[3]]
     [,1]     [,2] 
[1,] "patate" "ate"
[2,] "patiss" "iss"

Remplacement de motif : str_replace

Équivalent de sub et gsub :

str_replace_all(ch, "patate(.?)\\b", "pomme\\1 de terre")
[1] "M. pomme de terre"           "brocolis patissiers"        
[3] "pommes de terre patissieres"

Découper selon un motif : str_split

str_split découpe une chaîne en un nombre variable de sous-chaînes selon un motif de séparation :

ch <- "un et deux et trois et quatre"
str_split(ch, " et ")

[[1]]
[1] "un"     "deux"   "trois"  "quatre"

str_split_fixed fait de même mais en un nombre fixé de sous-chaînes :

str_split_fixed(ch, " et ", 3)
     [,1] [,2]   [,3]             
[1,] "un" "deux" "trois et quatre"
str_split_fixed(ch, " et ", 6)
     [,1] [,2]   [,3]    [,4]     [,5] [,6]
[1,] "un" "deux" "trois" "quatre" ""   ""

Modifier le comportement des motifs

On peut appliquer les fonctions igonre.case() et fixed() à un motif pour le rendre insensible à la casse ou le convertir en simple chaîne de texte :

ch <- "Mais Euh !"
str_detect(ch, ignore.case("euh"))

[1] TRUE
str_detect(ch, fixed("ai."))
[1] FALSE

Les expressions régulières utilisent par défaut la capture sur plusieurs lignes :

ch <- "Une ligne
et une deuxième"
str_match(ch, "ligne.et")

R>      [,1]       
[1,] "ligne\net"

Tags:

Comments are closed.