स्ट्रिंग में किसी वर्ण का स्थान ज्ञात करें


87

मैं एक स्ट्रिंग में एक चरित्र का स्थान ढूंढना चाहूंगा।

कहते हैं: string = "the2quickbrownfoxeswere2tired"

मैं चाहूंगा कि समारोह में वापसी हो 4और 24- एस के चरित्र स्थान 2में string


रेगेक्स का उपयोग क्यों करें? क्या r में एक .indexOf()या कुछ नहीं है?
फर्ज

1
मुझे शक है। डेवलपर्स निक्कर थे और सभी को रेगेक्स जानते थे। आर की स्ट्रिंग हैंडलिंग एक प्रकार की कुप्पी है।
IRTFM

जवाबों:


115

आप उपयोग कर सकते हैं gregexpr

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


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

या शायद str_locate_allपैकेज से stringrजिसके लिए एक आवरण है (के रूप में संस्करण 1.0)gregexpr 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'))

काम करना चाहिए (एक चरित्र वेक्टर दिया गया x)


हम आपके पहले 3 समाधानों द्वारा दी गई सूचियों / वस्तुओं से पूर्णांक कैसे निकाल सकते हैं?
3pitt

पूर्णांक आसानी से प्राप्त करने के regexprबजाय उपयोग करें gregexpr। या unlistआउटपुट पर उपयोग करें जैसा कि नीचे एक अन्य उत्तर में दिया गया है।
अरणी


20

आप अनलिस्ट का उपयोग करके केवल 4 और 24 आउटपुट कर सकते हैं:

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

2

str1 में str2 की nth घटना की स्थिति का पता लगाएं (Oracle 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

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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.