2014-12-01 15 views
6
string = "ABC3JFD456" 

Supponiamo di avere la stringa precedente, e desidero trovare quale sia la prima cifra nella stringa e memorizzare il suo valore. In questo caso, vorrei memorizzare il valore 3 (poiché è la prima cifra nella stringa). grepl("\\d", string) restituisce solo un valore logico, ma non mi dice nulla su dove o quale sia la prima cifra. Quale espressione regolare dovrei usare per trovare il valore della prima cifra?R: come trovare la prima cifra in una stringa

risposta

0
> which(sapply(strsplit(string, ""), grepl, patt="[[:digit:]]"))[1] 
[1] 4 

O

> gregexpr("[[:digit:]]", string)[[1]][1] 
[1] 4 

Quindi:

> splstr[[1]][ which(sapply(splstr, grepl, patt="[[:digit:]]"))[1] ] 
[1] "3" 

Nota che un risultato pieno da una chiamata gregexpr è una lista, da qui la necessità di estrarre il primo elemento con "[[" :

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

Grazie. Ora che ho l'indice, come posso estrarre la cifra dalla stringa? 'stringa [4]' non funzionerà – Adrian

+0

'regmatches' come usato dalla risposta di David Arenburg sarebbe il metodo di base R preferito per estrarre le corrispondenze regex dalle stringhe che penso. Inoltre, 'regexpr' rimuoverebbe la necessità di subsetare i risultati di' gregexpr' – thelatemail

+0

Sì, è vero. Sono un clutz regex. –

11

Base R

regmatches(string, regexpr("\\d", string)) 
## [1] "3" 

Oppure usando stringi

library(stringi) 
stri_extract_first(string, regex = "\\d") 
## [1] "3" 

Oppure usando stringr

library(stringr) 
str_extract(string, "\\d") 
## [1] "3" 
6

1) sub Prova sub con l'espressione regolare indicato che prende la stringa più breve fino una cifra, una cifra e poi tutto quanto segue e lo sostituisce con la cifra:

sub(".*?(\\d).*", "\\1", string) 

dando:

[1] "3" 

Questo funziona anche se string è un vettore di stringhe.

2) strapplyc Sarebbe anche possibile usare strapplyc da gsubfn nel qual caso un'espressione regolare ancora più semplice potrebbe essere utilizzato:

strapplyc(string, "\\d", simplify = TRUE)[1] 

dando la stessa o utilizzare questo che dà ancora una volta la stessa risposta ma funziona anche se string è un vettore di stringhe:

sapply(strapplyc(string, "\\d"), "[[", 1) 
2

Ottenere le posizioni delle cifre

tmp <- gregexpr("[0-9]", string) 
iloc <- unlist(tmp)[1] 

estratto la prima cifra

as.numeric(substr(string,iloc,iloc)) 

Uso regexpr è semplice

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

Oppure usa 'regexpr', che restituirà solo il primo hit di [0-9]. – thelatemail

+0

Sì, regexpr è migliore – user3969377

0

Una soluzione gsub che si basa sulla sostituzione delle sottostringhe precedenti e successive alla prima cifra con la stringa vuota:

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

Utilizzo rex potrebbe rendere questo tipo di attività un po 'più semplice.

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

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

#> first_number 
#> 1   3 
#> 2   4 
Problemi correlati