2011-09-16 4 views
9

इस स्ट्रिंग को देखते हुए पहले सभी लौट:regex - दूसरे घटना

DNS000001320_309.0/121.0_t0 

मैं कैसे "_" की दूसरी घटना से पहले सब कुछ वापसी होगी?

DNS000001320_309.0/121.0 

मैं आर

धन्यवाद उपयोग कर रहा हूँ।

+0

कोई गारंटी नहीं है कि तार हमेशा एक दूसरे होगा _ ? आप उन मामलों को कैसे संभालना चाहते हैं जहां 0 या 1 अंडरस्कोर हैं? – Brian

+0

इसमें हमेशा 2 "_" एस होगा ... गारंटीकृत! स्ट्रिंग 'sep = "_" 'का उपयोग कर 3 तारों का' पेस्ट 'है। – James

उत्तर

9

मुझे लगता है कि यह (_ के अंतिम घटना befor सब कुछ मैच के लिए regex) कार्य कर सकता:

_([^_]*)$ 

उदाहरण के लिए:

> sub('_([^_]*)$', '', "DNS000001320_309.0/121.0_t0") 
[1] "DNS000001320_309.0/121.0" 
+0

हाँ, अगर रेगेक्स-पथ चल रहा है, तो 'उप' 'gsub' से अधिक उपयुक्त होगा। –

+2

यदि दो अंडरस्कोर हैं तो यह दूसरे अंडरस्कोर से आगे का चयन करेगा, हालांकि जाहिर है कि ओपी से कोई फर्क नहीं पड़ता है, इसलिए मैं इसे केवल पोस्टरिटी के लिए इंगित करता हूं। – joran

+0

हाँ, अच्छा बिंदु @ जोरन। यह ओपी के लिए महत्वपूर्ण हो सकता है, लेकिन वह इसके बारे में पता नहीं हो सकता है। –

11

व्यक्तिगत रूप से, मैं regex नफरत है, तो सौभाग्य से वहाँ उनके बिना यह करने के लिए, बस स्ट्रिंग विभाजित करके एक तरीका है:

> s <- "DNS000001320_309.0/121.0_t0"  
> paste(strsplit(s,"_")[[1]][1:2],collapse = "_") 
[1] "DNS000001320_309.0/121.0" 

हालांकि निश्चित रूप से यह मानता है कि वहाँ हमेशा कम से कम 2 में अंडरस्कोर हो जाएगा अपने स्ट्रिंग, इसलिए सावधान रहें यदि आप इसे सदिश करते हैं और ऐसा नहीं है।

+0

ने मुझे 12secs द्वारा हराया: पी – darckeen

+0

@ डेर्किन ग्रेट दिमाग .... जैसा कि वे कहते हैं। ;) – joran

+0

'strplit' के लिए +1 - जिस तरह से मैं इस समस्या को हल करता हूं R – daroczig

6

सुंदर नहीं है, लेकिन इस चाल

mystr <- "DNS000001320_309.0/121.0_t0" 

mytok <- paste(strsplit(mystr,"_")[[1]][1:2],collapse="_") 
36

निम्न स्क्रिप्ट करना होगा:

s <- "DNS000001320_309.0/121.0_t0" 
t <- gsub("^([^_]*_[^_]*)_.*$", "\\1", s) 
t 

प्रिंट होगा:

DNS000001320_309.0/121.0 

regex का एक त्वरित विवरण:

^   # the start of the input 
(  # start group 1 
    [^_]* # zero or more chars other than `_` 
    _  # a literal `_` 
    [^_]* # zero or more chars other than `_` 
)   # end group 1 
_   # a literal `_` 
.*  # consume the rest of the string 
$   # the end of the input 

जो साथ बदल दिया है:

\\1  # whatever is matched in group 1 

और अगर वहाँ कम से कम 2 अंडरस्कोर हैं, स्ट्रिंग नहीं बदला है।

+0

वाह, वास्तव में अच्छा, विस्तृत उत्तर (+1)। मुझे निश्चित रूप से मेरा समाधान बेहतर से पसंद है :) – daroczig