J'essaye d'extraire un nombre d'une chaîne.
Et faites quelque chose comme [0-9]+
sur la chaîne "aaa12xxx"
et obtenez "12"
.
Je pensais que ce serait quelque chose comme:
> grep("[0-9]+", "aaa12xxx", value=TRUE)
[1] "aaa12xxx"
Et puis j'ai pensé ...
> sub("[0-9]+", "\\1", "aaa12xxx")
[1] "aaaxxx"
Mais j'ai eu une forme de réponse en faisant:
> sub("[0-9]+", "ARGH!", "aaa12xxx")
[1] "aaaARGH!xxx"
Il me manque un petit détail.
?str_extract
j'ai vustr_extract_all
et la vie était à nouveau belle.Il est probablement un peu hâtif de dire ' ignorer les fonctions standard ' - le fichier d'aide pour
?gsub
les références même spécifiquement dans 'Voir aussi':Donc, cela fonctionnera, et c'est assez simple:
la source
Peut être
la source
Vous pouvez utiliser la correspondance différée des expressions rationnelles PERL:
Essayer de remplacer des non-chiffres entraînera une erreur dans ce cas.
la source
Une façon serait la suivante:
Maintenant, notez que regexpr vous donne les indices de début et de fin de la chaîne:
Vous pouvez donc utiliser cette information avec la fonction substr
Je suis sûr qu'il existe un moyen plus élégant de le faire, 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.
la source
Utilisez des parenthèses de capture dans l'expression régulière et des références de groupe dans le remplacement. Tout ce qui est entre parenthèses est mémorisé. Ensuite, ils sont accédés par \ 2, le premier élément. La première barre oblique inverse échappe à l'interprétation de la barre oblique inverse dans R afin qu'elle soit transmise à l'analyseur d'expression régulière.
la source
Utilisation de strapply dans le package gsubfn. strapply est comme apply en ce que les arguments sont objet, modificateur et fonction sauf que l'objet est un vecteur de chaînes (plutôt qu'un tableau) et que le modificateur est une expression régulière (plutôt qu'une marge):
Cela dit de faire correspondre un ou plusieurs chiffres (\ d +) dans chaque composant de x en passant chaque correspondance par as.numeric. Il renvoie une liste dont les composants sont des vecteurs de correspondances des composants respectifs de x. En regardant la sortie, nous voyons que le premier composant de x a une correspondance qui est 13 et le deuxième composant de x a deux correspondances qui sont 12 et 34. Voir http://gsubfn.googlecode.com pour plus d'informations.
la source
Une autre solution:
la source
Une différence importante entre ces approches est le comportement en cas de non-concordance. Par exemple, la méthode regmatches peut ne pas renvoyer une chaîne de la même longueur que l'entrée s'il n'y a pas de correspondance dans toutes les positions
la source
Une solution à cette question
[[: chiffre:]] : chiffre [0-9]
{1,} : correspond au moins 1 fois
la source
En utilisant le package unglue, nous ferions ce qui suit:
Créé le 06/11/2019 par le package reprex (v0.3.0)
Utilisez l'
convert
argument pour convertir automatiquement en nombre:la source
Vous pouvez écrire vos fonctions regex avec C ++, les compiler dans une DLL et les appeler depuis R.
appeler R comme
la source