Suchen Sie die Position eines Zeichens in einer Zeichenfolge

86

Ich möchte die Position eines Zeichens in einer Zeichenfolge finden.

Sagen: string = "the2quickbrownfoxeswere2tired"

Ich möchte, dass die Funktion zurückkehrt 4und 24- die Zeichenposition des 2s in string.

Ricardo
quelle
Warum einen regulären Ausdruck verwenden? Hat r nicht ein .indexOf()oder so?
fge
1
Ich bezweifle das. Die Entwickler waren Nixer und gingen davon aus, dass jeder Regex kannte. Rs String-Handling ist etwas klobig.
IRTFM

Antworten:

114

Sie können verwenden gregexpr

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


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

oder vielleicht str_locate_allaus einem Paket, für stringrdas ein Wrapper ist (ab Version 1.0)gregexpr stringi::stri_locate_allstringr

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

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

Beachten Sie, dass Sie einfach verwenden können stringi

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

Eine andere Option in der Basis Rwäre so etwas wie

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

sollte funktionieren (mit einem Zeichenvektor x)

mnel
quelle
Wie können wir die ganzen Zahlen aus den Listen / Objekten extrahieren, die von Ihren ersten drei Lösungen zurückgegeben wurden?
3pitt
Verwenden Sie regexprstatt gregexpr, um die ganzen Zahlen leicht zu erhalten. Oder verwenden Sie unlistdie Ausgabe wie in einer anderen Antwort unten angegeben.
Arani
39

Hier ist eine weitere einfache Alternative.

> which(strsplit(string, "")[[1]]=="2")
[1]  4 24
Jilber Urbina
quelle
Kannst du erklären was das [[1]]macht?
Francoiskroll
@francoiskroll, [[1]] repräsentiert das erste Element der Liste.
Prafulla
19

Sie können die Ausgabe nur 4 und 24 mit unlist machen:

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

quelle
2

Suchen Sie die Position des n-ten Vorkommens von str2 in str1 (gleiche Reihenfolge der Parameter wie Oracle SQL INSTR). Gibt 0 zurück, wenn es nicht gefunden wird

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
Abdelmonem Mahmoud Amer
quelle
2

Verwenden Sie Folgendes, um nur die ersten Standorte lapply()zu finden min():

my_string <- c("test1", "test1test1", "test1test1test1")

unlist(lapply(gregexpr(pattern = '1', my_string), min))
#> [1] 5 5 5

# or the readable tidyverse form
my_string %>%
  gregexpr(pattern = '1') %>%
  lapply(min) %>%
  unlist()
#> [1] 5 5 5

Um nur die zu finden Verwenden Sie Folgendes, um letzten Standorte lapply()zu finden max():

unlist(lapply(gregexpr(pattern = '1', my_string), max))
#> [1]  5 10 15

# or the readable tidyverse form
my_string %>%
  gregexpr(pattern = '1') %>%
  lapply(max) %>%
  unlist()
#> [1]  5 10 15
MS Berends
quelle