gsub

2012-11-28 5 views
7

के साथ चरित्र की पहली घटना से शुरूआत करें मेरे पास निम्न रेगेक्स है कि मैं वाक्य की शुरुआत से पहले ## तक सब कुछ लेना चाहता हूं। मैं strsplit का उपयोग कर सकता हूं क्योंकि मैं यह कार्य करने के लिए प्रदर्शन करता हूं लेकिन gsub समाधान पसंद करता हूं। यदि gusub सही उपकरण नहीं है (मुझे लगता है कि यह हालांकि है) मैं बेस समाधान पसंद करूंगा क्योंकि मैं बेस रेगेक्स टूल सीखना चाहता हूं।gsub

x <- "gfd gdr tsvfvetrv erv tevgergre ## vev fe ## vgrrgf" 

strsplit(x, "##")[[c(1, 1)]] #works 

gsub("(.*)(##.*)", "\\1", x) #I want to work 

उत्तर

13

बस इसे "गैर लालची" बनाने के लिए, एक चरित्र को जोड़ने के पहले परिमाणक के बाद एक ? डाल:

gsub("(.*?)(##.*)", "\\1", x) 
# [1] "gfd gdr tsvfvetrv erv tevgergre " 

यहाँ प्रासंगिक दस्तावेज है, से ?regex

डिफ़ॉल्ट पुनरावृत्ति से लालची है, इसलिए पुनरावृत्ति की अधिक से अधिक संभव संख्या प्रयोग किया जाता है। इसे '' जोड़कर 'न्यूनतम' में बदला जा सकता है? क्वांटिफायर के लिए।

+0

एक 'gsub' समाधान के लिए धन्यवाद और यह बता रहा है कि मेरी सोच में क्या गलत था। +1 –

1

स्ट्रिंग की शुरुआत में अपने regex के रूप में इस प्रयास करें

^[^#]+ 

शुरू होता है और कुछ भी मेल खाता नहीं एक # पहले #

4

अप करने के लिए मैं कहना चाहता हूँ:

sub("##.*", "", x) 

के पहले अवसर सहित और बाद में सबकुछ हटा देता है।

+0

महान और पहला समाधान काम करता है। धन्यवाद। +1 –

3

इस मामले में, मैं उलटा करने के लिए कहेंगे, यानी कोई रिक्त स्ट्रिंग के साथ # निम्नलिखित सब कुछ बदल देते हैं:

gsub("#.*$", "", x) 
[1] "gfd gdr tsvfvetrv erv tevgergre " 

लेकिन आप भी अपने रेगुलर एक्सप्रेशन से काम करने के लिए गैर लालची संशोधक ? उपयोग कर सकते हैं जिस तरह से आप का सुझाव दिया:

gsub("(.*?)#.*$", "\\1", x) 
[1] "gfd gdr tsvfvetrv erv tevgergre " 
+0

धन्यवाद। जैसा कि मैंने पूछा था यह पहला 'जीएसयूबी' समाधान था। +1 –

1

पहले से ही यहाँ कई सरल जवाब नहीं है, लेकिन जब से आप अपने प्रश्न में संकेत दिया है कि आप आधार आर में regex समर्थन के बारे में जानकारी चाहते हैं, यहाँ एक और तरीका बताया सकारात्मक अग्रदर्शी अभिकथन (?=#) और गैर लालची विकल्प (?U) का उपयोग कर ।

regmatches(x, regexpr('(?U)^.+(?=#)', x, perl=TRUE)) 
[1] "gfd gdr tsvfvetrv erv tevgergre " 
+0

आगे रेगेक्स उपयोग जोड़ने के लिए समय निकालने के लिए धन्यवाद। मैंने केवल कुछ ही समय में 'regmatches' का उपयोग किया है, लेकिन यह बहुत मदद के साथ था। धन्यवाद।+1 –

1

यहां एक और दृष्टिकोण है जो अधिक जटिल नियमित अभिव्यक्ति के बजाय अधिक स्ट्रिंग टूल का उपयोग करता है। यह पहली बार पहले ## के स्थान पाता है और फिर उस समय तक सबस्ट्रिंग निकालता है:

library(stringr) 
x <- "gfd gdr tsvfvetrv erv tevgergre ## vev fe ## vgrrgf" 
loc <- str_locate(x, "##") 
str_sub(x, 1, loc[, "start"] - 1) 

आम तौर पर, मुझे लगता है कि कदम दर कदम दृष्टिकोण इस तरह की जटिल नियमित अभिव्यक्ति की तुलना में अधिक पोषणीय है।

+0

मैंने देखा है कि आपने पिछली पोस्ट में भी regexing के लिए चरण दृष्टिकोण की सिफारिश की है। यह दृष्टिकोण (विशेष रूप से पाठ की छोटी मात्रा के साथ) अक्सर अधिक प्रबंधनीय होता है। +1 –

संबंधित मुद्दे