Recherche…


Introduction

sub et gsub sont utilisés pour éditer des chaînes à l'aide de patterns. Reportez-vous à la section Correspondance et remplacement de motif pour plus d'informations sur les fonctions associées et les expressions régulières pour savoir comment créer un motif.

Réorganiser les chaînes de caractères à l'aide de groupes de capture

Si vous souhaitez modifier l'ordre des chaînes de caractères, vous pouvez utiliser des parenthèses dans le pattern pour regrouper des parties de la chaîne. Ces groupes peuvent, dans l'argument de replacement , être ajoutés à l'aide de nombres consécutifs.

L'exemple suivant montre comment vous pouvez réorganiser un vecteur de noms de la forme "nom de famille, prénom" en un vecteur de la forme "nom de famille".

library(randomNames) 
set.seed(1)

strings <- randomNames(5)
strings
# [1] "Sigg, Zachary"        "Holt, Jake"           "Ortega, Sandra"       "De La Torre, Nichole"
# [5] "Perkins, Donovon"  

sub("^(.+),\\s(.+)$", "\\2 \\1", strings)
# [1] "Zachary Sigg"        "Jake Holt"           "Sandra Ortega"       "Nichole De La Torre"
# [5] "Donovon Perkins"    

Si vous n'avez besoin que du nom de famille, vous pouvez simplement répondre aux premières paires de parenthèses.

sub("^(.+),\\s(.+)", "\\1", strings)
# [1] "Sigg"        "Holt"        "Ortega"      "De La Torre" "Perkins"  

Éliminer les éléments consécutifs dupliqués

Disons que nous voulons éliminer l'élément de sous-séquence dupliqué d'une chaîne (il peut y en avoir plusieurs). Par exemple:

2,14,14,14,19

et le convertir en:

2,14,19

En utilisant gsub , nous pouvons y arriver:

gsub("(\\d+)(,\\1)+","\\1", "2,14,14,14,19")
[1] "2,14,19"

Cela fonctionne aussi pour plusieurs répétitions différentes, par exemple:

 > gsub("(\\d+)(,\\1)+", "\\1", "2,14,14,14,19,19,20,21")
[1] "2,14,19,20,21"

Expliquons l'expression régulière:

  1. (\\d+) : Un groupe 1 délimité par () et trouve n'importe quel chiffre (au moins un). Rappelez-vous que nous devons utiliser la double barre oblique inverse ( \\ ) car pour une variable de caractère, une barre oblique inverse représente un caractère d'échappement spécial pour les délimiteurs de chaîne littéraux ( \" ou \' ). \d\ est équivalent à: [0-9] .
  2. , Un signe de ponctuation: , (nous pouvons inclure des espaces ou tout autre delimiter)
  3. \\1 : Une chaîne identique au groupe 1, c'est-à-dire le nombre répété. Si cela ne se produit pas, le motif ne correspond pas.

Essayons une situation similaire: éliminer les mots répétés consécutifs:

one,two,two,three,four,four,five,six

Ensuite, remplacez simplement \d par \w , où \w correspond à n'importe quel caractère, y compris: toute lettre, chiffre ou trait de soulignement. C'est équivalent à [a-zA-Z0-9_] :

> gsub("(\\w+)(,\\1)+", "\\1", "one,two,two,three,four,four,five,six")
[1] "one,two,three,four,five,six"
> 

Ensuite, le modèle ci-dessus inclut comme cas particulier un cas de chiffres dupliqués.



Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow