2013-01-10 5 views
56

문자열에있는 문자의 위치를 ​​찾고 싶습니다.문자열의 문자 위치를 찾으십시오.

말 : string = "the2quickbrownfoxeswere2tired"

내가 함수가 424를 반환하고 싶습니다 - 2 S의 문자 위치를 string에.

+0

정규식을 사용해야하는 이유는 무엇입니까? r에는'.indexOf()'또는 무엇인가가 없습니까? – fge

+0

나는 그것을 의심한다. 개발자는 Nixers 였고 모두가 정규식을 알고 있다고 가정합니다. R의 문자열 처리는 일종의 kludgy입니다. –

답변

79

당신은 사용할 수 있습니다 gregexpr

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


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

또는 간단하게 사용할 수

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

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

노트 (stringr 버전 1.0 현재) gregexprstringi::stri_locate_all의 래퍼 인 패키지 stringr에서 아마 str_locate_allstringi

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

기본 R의 또 다른 옵션이 작동한다

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

같은 (주어진 문자 벡터 x)

+0

첫 번째 3 가지 솔루션에서 반환 한 목록/개체에서 정수를 추출하는 방법은 무엇입니까? –

26

여기에 또 다른 간단한 대안입니다 것입니다.

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

당신은 단 4 24 올라가지 사용하여 출력을 할 수 있습니다 :

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

가 STR1에서 STR2의 n 번째 발생 (오라클 SQL INSTR과 같은 매개 변수의 순서)의 위치를 ​​찾을 수는 0을 반환 찾지 못하면

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 
관련 문제