133 votes

Extraire une correspondance d'expression régulière dans la version R 2.10

Je suis en train d'extraire un nombre à partir d'une chaîne.

Et faire quelque chose comme ceci [0-9]+ sur cette chaîne "aaaa12xxxx" et "12".

Je pensais que ce serait quelque chose comme:

> grep("[0-9]+","aaa12xxx", value=TRUE)
[1] "aaa12xxx"

Et puis j'ai pensé que...

> sub("[0-9]+", "\\1", "aaa12xxxx")
[1] "aaa12xxx"

Mais j'ai eu une certaine forme de réponse à faire:

> sub("[0-9]+", "ARGH!", "aaa12xxxx")
[1] "aaaARGH!xxx"

Il y a un petit détail qui me manque, s'il vous Plaît conseils :-)

Je suis l'aide de R version 2.10.1 (2009-12-14)

Merci !


Commentaires sur la solution

La meilleure solution est d'ignorer les fonctions standard et installer Hadley Wickham est stringr paquet pour obtenir quelque chose qui a du sens.

Bravo à Marek pour comprendre comment la bibliothèque standard travaillé.

188voto

hadley Points 33766

Utilisez le nouveau package stringr qui englobe toutes les expressions régulières existantes dans une syntaxe cohérente et en ajoute quelques-unes qui manquent:

 library(stringr)
str_locate("aaa12xxx", "[0-9]+")
#      start end
# [1,]     4   5
str_extract("aaa12xxx", "[0-9]+")
# [1] "12"
 

125voto

thelatemail Points 21202

Il est probablement un peu hâtif de dire " ignorer les fonctions standard " - le fichier d'aide pour ?gsub même avec des références spécifiques dans "Voir aussi":

'regmatches' pour extraire les sous-chaînes correspondantes en fonction des résultats de 'regexpr', 'gregexpr' et 'regexec'.

Donc, cela fonctionnera et est assez simple:

 txt <- "aaa12xxx"
regmatches(txt,regexpr("[0-9]+",txt))
#[1] "12"
 

29voto

Marek Points 18000

Peut être

 gsub("[^0-9]", "", "aaa12xxxx")
# [1] "12"
 

17voto

Vous pouvez utiliser la correspondance paresseuse de PERL regexs:

 > sub(".*?([0-9]+).*", "\\1", "aaa12xx99",perl=TRUE)
[1] "12"
 

Essayer de remplacer les chiffres non numériques entraînera une erreur dans ce cas.

5voto

Robert Points 488

Une façon serait la suivante:

 test <- regexpr("[0-9]+","aaa12456xxx")
 

Maintenant, notez que regexpr vous donne les index de début et de fin de la chaîne:

     > test
[1] 4
attr(,"match.length")
[1] 5
 

Donc, vous pouvez utiliser cette information avec la fonction substr

 substr("aaa12456xxx",test,test+attr(test,"match.length")-1)
 

Je suis sûr qu'il existe un moyen plus élégant de faire cela, mais c'était le moyen le plus rapide que j'ai pu trouver. Alternativement, vous pouvez utiliser sub / gsub pour supprimer ce que vous ne voulez pas laisser ce que vous voulez.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X