Tìm vị trí của một ký tự trong chuỗi


87

Tôi muốn tìm vị trí của một ký tự trong một chuỗi.

Nói: string = "the2quickbrownfoxeswere2tired"

Tôi muốn hàm trả về 424- vị trí ký tự của 2s trong string.


Tại sao lại sử dụng regex? R không có một .indexOf()cái gì đó?
fge,

1
Tôi nghi ngờ điều đó. Các nhà phát triển là Nixers và cho rằng mọi người đều biết regex. Xử lý chuỗi của R là loại kludgy.
IRTFM

Câu trả lời:


115

Bạn có thể dùng gregexpr

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


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

hoặc có thể str_locate_alltừ gói stringrlà trình bao bọc (kể từ phiên bản 1.0)gregexpr stringi::stri_locate_allstringr

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

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

lưu ý rằng bạn chỉ có thể sử dụng stringi

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

Một tùy chọn khác trong cơ sở Rsẽ giống như

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

sẽ hoạt động (được cung cấp một vectơ ký tự x)


làm thế nào chúng tôi có thể trích xuất các số nguyên từ danh sách / đối tượng được trả về bởi 3 giải pháp đầu tiên của bạn?
3pitt

Sử dụng regexprthay vì gregexprđể lấy số nguyên một cách dễ dàng. Hoặc sử dụng unlisttrên đầu ra như được chỉ ra trong một câu trả lời khác bên dưới.
Arani

41

Đây là một giải pháp thay thế đơn giản khác.

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

Bạn có thể giải thích những gì [[1]]không?
francoiskroll

@francoiskroll, [[1]] đại diện cho phần tử đầu tiên của danh sách.
Prafulla

20

Bạn có thể đặt đầu ra chỉ 4 và 24 bằng cách sử dụng không công khai:

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

2

tìm vị trí xuất hiện thứ n của str2 trong str1 (cùng thứ tự tham số với Oracle SQL INSTR), trả về 0 nếu không tìm thấy

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

Để chỉ tìm các vị trí đầu tiên , hãy sử dụng lapply()với 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

Để chỉ tìm các vị trí cuối cùng , hãy sử dụng lapply()với 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

Bạn cũng có thể sử dụng grep:

grep('2', strsplit(string, '')[[1]])
#4 24
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.