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.


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)


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

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

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

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.