2013-01-10 18 views
56

Vorrei trovare la posizione di un carattere in una stringa.trovare la posizione del carattere nella stringa

Di ': string = "the2quickbrownfoxeswere2tired"

Vorrei la funzione per tornare 4 e 24 - la posizione del carattere dei 2 s in string.

+0

Perché utilizzare un regex? Non r ha un '.indexOf()' o qualcosa del genere? – fge

+0

Ne dubito. Gli sviluppatori erano Nixer e presumevano che tutti conoscessero l'espressione regolare. La gestione delle stringhe di R è abbastanza complicata. –

risposta

79

È possibile utilizzare gregexpr

gregexpr(pattern ='2',"the2quickbrownfoxeswere2tired") 


[[1]] 
[1] 4 24 
attr(,"match.length") 
[1] 1 1 
attr(,"useBytes") 
[1] TRUE 

o forse str_locate_all dal pacchetto stringr che è un wrapper per gregexprstringi::stri_locate_all (come di stringr versione 1,0)

library(stringr) 
str_locate_all(pattern ='2', "the2quickbrownfoxeswere2tired") 

[[1]] 
    start end 
[1,]  4 4 
[2,] 24 24 

nota che si può semplicemente utilizzare stringi

library(stringi) 
stri_locate_all(pattern = '2', "the2quickbrownfoxeswere2tired", fixed = TRUE) 

Un'altra opzione a base di R sarebbe qualcosa di simile

lapply(strsplit(x, ''), function(x) which(x == '2')) 

dovrebbe funzionare (dato un vettore di carattere x)

+0

come possiamo estrarre i numeri interi dagli elenchi/oggetti restituiti dalle prime 3 soluzioni? –

26

Ecco un'altra alternativa semplice.

> which(strsplit(string, "")[[1]]=="2") 
[1] 4 24 
10

È possibile effettuare l'output appena 4 e 24 utilizzando non elencati:

unlist(gregexpr(pattern ='2',"the2quickbrownfoxeswere2tired")) 
[1] 4 24 
0

trovare la posizione del verificarsi n-esima di str2 in str1 (stesso ordine di parametri come Oracle SQL INSTR), restituisce 0 se non trovato

instr <- function(str1,str2,startpos=1,n=1){ 
    aa=unlist(strsplit(substring(str1,startpos),str2)) 
    if(length(aa) < n+1) return(0); 
    return(sum(nchar(aa[1:n])) + startpos+(n-1)*nchar(str2)) 
} 


instr('xxabcdefabdddfabx','ab') 
[1] 3 
instr('xxabcdefabdddfabx','ab',1,3) 
[1] 15 
instr('xxabcdefabdddfabx','xx',2,1) 
[1] 0 
Problemi correlati