문자열에서 문자의 위치 찾기


87

문자열에서 문자의 위치를 ​​찾고 싶습니다.

말하다: string = "the2quickbrownfoxeswere2tired"

함수를 반환 4하고 -s 24의 문자 위치를 .2string


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

1
나는 그것을 의심한다. 개발자는 Nixers였으며 모두가 정규식을 알고 있다고 가정했습니다. R의 문자열 처리는 다소 복잡합니다.
IRTFM 2013 년

답변:


115

당신이 사용할 수있는 gregexpr

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


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

또는 아마도 ( 버전 1.0 기준) 래퍼 인 str_locate_all패키지에서stringrgregexpr stringi::stri_locate_allstringr

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

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

간단히 사용할 수 있습니다. stringi

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

기본의 또 다른 옵션은 R다음과 같습니다.

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

SHOULD 작업 (문자 벡터 제공 x)


처음 세 가지 솔루션이 반환 한 목록 / 객체에서 정수를 어떻게 추출 할 수 있습니까?
3pitt

regexpr대신 사용 gregexpr하면 정수를 쉽게 얻을 수 있습니다. 또는 unlist아래 다른 답변에 표시된대로 출력에 사용 하십시오.
Arani

41

또 다른 간단한 대안이 있습니다.

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

무엇을 설명 할 수 있습니까 [[1]]?
francoiskroll

@francoiskroll, [[1]]은 목록의 첫 번째 요소를 나타냅니다.
Prafulla

20

unlist를 사용하여 출력을 4와 24로 만들 수 있습니다.

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

2

str1 (Oracle SQL INSTR과 동일한 순서의 매개 변수)에서 str2의 n 번째 발생 위치를 찾고, 찾을 수없는 경우 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

2

첫 번째 위치 만 찾으려면 다음 lapply()과 함께 사용하십시오 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

마지막 위치 만 찾으 려면와 lapply()함께 사용하십시오 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

1

다음을 사용할 수도 있습니다 grep.

grep('2', strsplit(string, '')[[1]])
#4 24
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.