कोष्ठकों की निम्नलिखित स्ट्रिंग को देखते हुए, मैं एक विशिष्ट कोष्ठक को हटाने का प्रयास कर रहा हूं, जहां इसके एक कोष्ठक की स्थिति 1 से चिह्नित है।

((((((((((((((((((********))))))))))))))))))
00000000000000000000000000000000010000000000

तो उपरोक्त उदाहरण के लिए, मैं जिस समाधान की तलाश कर रहा हूं वह है

((((((((((-(((((((********)))))))-))))))))))
00000000000000000000000000000000010000000000

मैं विभाजित करने के लिए strsplit stringr से फ़ंक्शन का उपयोग करने का प्रयास कर रहा हूं और 1 के साथ चिह्नित ब्रैकेट की अनुक्रमणिका प्राप्त कर रहा हूं। लेकिन मुझे यकीन नहीं है कि मैं इसके संबंधित समापन ब्रैकेट की अनुक्रमणिका कैसे प्राप्त कर सकता हूं। क्या कोई इस पर कुछ इनपुट दे सकता है ..

मैंने क्या किया..

a = "((((((((((-(((((((********)))))))-))))))))))"
b = "00000000000000000000000000000000010000000000"
which(unlist(strsplit(b,"")) == 1)
#[1] 34
a_mod = unlist(strsplit(a,""))[-34]

यहाँ, मैंने कोष्ठकों का एक कोष्ठक हटा दिया है जिसे मैं हटाना चाहता था लेकिन मुझे नहीं पता कि मैं इसके संगत उद्घाटन कोष्ठक को कैसे हटा सकता हूँ जो इस उदाहरण में 11वें स्थान पर है

1
GPVS 21 मई 2020, 21:49

4 जवाब

सबसे बढ़िया उत्तर

Pos2 देते हुए b में 1 का पता लगाएँ और n देते हुए b की लंबाई भी परिकलित करें। फिर स्थिति pos2 और pos1 = n-pos2+1 को ऋणात्मक वर्णों से बदलें। अधिक जानकारी के लिए ?gregexpr और ?nchar और ?substr देखें। कोई पैकेज का उपयोग नहीं किया जाता है।

pos2 <- regexpr(1, b)
n <- nchar(a)
pos1 <- n - pos2 + 1
substr(a, pos1, pos1) <- substr(a, pos2, pos2) <- "-"

a
## [1] "((((((((((-(((((((********)))))))-))))))))))"
2
G. Grothendieck 22 मई 2020, 02:23

आपको दिखाना चाहिए कि आपने क्या प्रयास किया है। आपके उदाहरण के लिए काम करने वाला एक बहुत ही आसान तरीका कुछ ऐसा करना होगा:

gsub("\\*){8}", "\\*)))))))-", "((((((((((((((((((********))))))))))))))))))")
#> [1] "((((((((((((((((((********)))))))-))))))))))"

संपादित करें: आपके प्रश्न के उत्तर में: यह निर्भर करता है कि अन्य समान उदाहरणों से आपका क्या तात्पर्य है। यदि आप पूरी तरह से स्ट्रिंग में स्थिति से जाते हैं, तो आपके पास पहले से ही जी ग्रोथेंडिक से एक उत्कृष्ट उत्तर है। यदि आप एक समाधान चाहते हैं जहाँ आप nth क्लोजिंग ब्रैकेट को बदलना चाहते हैं, उदाहरण के लिए, आप यह कर सकते हैं:

s <- "((((((((((((((((((********))))))))))))))))))"
replace_par <- function(n, string) {
    sub(paste0("(!?\\))(\\)){", n, "}"), 
     paste0(paste(rep(")", (n-1)), collapse=""), "-"), 
     string, perl = TRUE)}
replace_par(8, s)
#> [1] "((((((((((((((((((********)))))))-)))))))))"

2020-05-21 को reprex पैकेज द्वारा बनाया गया (v0.3.0)

0
user12728748 21 मई 2020, 23:18

चूंकि कोष्ठक जोड़े गए हैं, करीबी कोष्ठकों की अनुक्रमणिका केवल स्ट्रिंग की लंबाई है जो खुले कोष्ठक की अनुक्रमणिका है (वे स्ट्रिंग सिरों से समान दूरी पर हैं)

library(stringr)
string <- "((((((((((((((((((********))))))))))))))))))"
b <- "00000000000000000000000000000000010000000000"
location <- str_locate(b, "1")[1]
len <- str_length(string)

substr(string, location, location) <- "-"
substr(string, len-location, len-location) <- "-"
string
"(((((((((-((((((((********)))))))-))))))))))"
0
Greg 21 मई 2020, 22:19

आप एक ऐसा फ़ंक्शन लिख सकते हैं जो आपके इच्छित तरीके से प्रतिस्थापन करता है:

strreplace <- function(x,y,val = "-")
{
  regmatches(x,regexpr(1,y)) <- val
  sub(".([(](?:[^()]|(?1))*+[)])(?=-)", paste0(val, "\\1"), x, perl = TRUE)
}

a <- "((((((((((((((((((********))))))))))))))))))"
b < -"00000000000000000000000000000000010000000000"
strreplace(a, b)
[1] "((((((((((-(((((((********)))))))-))))))))))"

# Nested paranthesis
a = "((((****))))((((((((((((((((((********))))))))))))))))))"
b = "00000000000000000000000000000000000000000000010000000000"
strreplace(a,b)
[1] "((((****))))((((((((((-(((((((********)))))))-))))))))))"
0
Onyambu 22 मई 2020, 00:02