2013-01-10 57 views
56

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

nói: string = "the2quickbrownfoxeswere2tired"

Tôi muốn các chức năng để trở 424 - vị trí nhân vật của 2 s trong string.

+0

Tại sao lại sử dụng regex? Không r có '.indexOf()' hay gì đó? – fge

+0

Tôi nghi ngờ điều đó. Các nhà phát triển là Nixers và giả định mọi người đều biết regex. Xử lý chuỗi R là loại kludgy. –

Trả lời

79

Bạn có thể sử dụng gregexpr

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


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

hoặc có lẽ str_locate_all từ gói stringr mà là một wrapper cho gregexprstringi::stri_locate_all (tính stringr phiên bản 1,0)

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ở R sẽ là một cái gì đó giống như

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

nên làm việc (cho một vector nhân vật x)

+0

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

26

Đây là một sự thay thế đơn giản.

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

Bạn có thể làm cho sản lượng chỉ 4 và 24 sử dụng không công khai:

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

tìm ra vị trí của sự xuất hiện thứ n của str2 trong str1 (cùng thứ tự của các thông số như 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 
Các vấn đề liên quan