8
votes

R: Comment trouver le premier chiffre dans une chaîne

    string = "ABC3JFD456"
Suppose I have the above string, and I wish to find what the first digit in the string is and store its value. In this case, I would want to store the value 3 (since it's the first-occuring digit in the string). grepl("\\d", string) only returns a logical value, but does not tell me anything about where or what the first digit is. Which regular expression should I use to find the value of the first digit?

0 commentaires

6 Réponses :


0
votes
>  gregexpr("[[:digit:]]", string)
[[1]]
[1]  4  8  9 10
attr(,"match.length")
[1] 1 1 1 1
attr(,"useBytes")
[1] TRUE

3 commentaires

Merci. Maintenant que j'ai l'index, comment puis-je extraire le chiffre de la chaîne? chaîne [4] ne fonctionnera pas


RegMatches Tel qu'utilisé par la réponse de David Arenburg serait la méthode de base préférée d'extraction des matchs de regex des cordes que je pense. En outre, regexpr supprimerait la nécessité de sous-ensemble les résultats de gregexpr


Oui, c'est vrai. Je suis une regex clutz.



12
votes

base r xxx

ou en utilisant stringi xxx

ou en utilisant stringr xxx


0 commentaires

7
votes

1) SUB ESSAYER SUB avec l'expression régulière indiquée qui prend la chaîne la plus courte jusqu'à un chiffre, un chiffre, puis tout suivi et le remplace avec le chiffre: < Pré> xxx

donnant: xxx

ceci fonctionne également si chaîne est un vecteur de chaînes. < p> 2) strapplyclyclyclyclyclyclyclyc Il serait également possible d'utiliser strapplyclyclyc de gsubfn auquel cas une expression régulière encore plus simple pourrait être utilisée: xxx

donnant la même ou utilisez ceci qui donne la même réponse, mais fonctionne également si String est un vecteur de chaînes: xxx


0 commentaires

3
votes

Obtenez les emplacements des chiffres xxx pré>

extraire le premier chiffre p> xxx pré>

à l'aide de REGEXPR est plus simple p>

tmp<-regexpr("[0-9]",string)
if(tmp[[1]]>=0) {
    iloc <- tmp[1]
    num <- as.numeric(substr(string,iloc,iloc))
}


2 commentaires

Ou il suffit d'utiliser regexpr , qui ne renvoie que le premier coup de [0-9].


Oui, Regexpr est mieux



0
votes

A Solution GSUB CODE> basé sur le remplacement des sous-chaînes précédant et suivant le premier chiffre avec la chaîne vide:

gsub("^\\D*(?=\\d)|(?<=\\d).*", "", string, perl = TRUE)
# [1] "3"


0 commentaires

1
votes

en utilisant Rex peut faire ce type de tâche un peu Plus simple.

string = c("ABC3JFD456", "ARST4DS324")

re_matches(string,
  rex(
    capture(name = "first_number", digit)
    )
  )

#>   first_number
#> 1            3
#> 2            4


0 commentaires