आर

2016-08-22 5 views
10

में अन्य दो तारों के बीच एक स्ट्रिंग निकालने के लिए मैं एक अज्ञात सबस्ट्रिंग निकालने का एक आसान तरीका खोजने की कोशिश कर रहा हूं (कुछ भी हो सकता है) जो दो ज्ञात सबस्ट्रिंग्स के बीच दिखाई देता है।आर

a<-" anything goes here, STR1 GET_ME STR2, anything goes here"

मैं (व्हाइट स्पेस के बिना) स्ट्रिंग GET_ME जो str1 और str2 के बीच है निकालने के लिए की जरूरत है: उदाहरण के लिए, मैं एक स्ट्रिंग है।

मैं str_extract(a, "STR1 (.+) STR2") कोशिश कर रहा हूँ, लेकिन मैं पूरे मैच हो रही है

[1] "STR1 GET_ME STR2" 

मैं निश्चित रूप से जाना जाता है तार पट्टी कर सकते हैं, सबस्ट्रिंग मैं की जरूरत है अलग करने के लिए है, लेकिन मुझे लगता है कि ऐसा करने के लिए एक क्लीनर तरीका होना चाहिए यह एक सही नियमित अभिव्यक्ति का उपयोग करके।

+0

उपयोग [इस] (https://gist.github.com/MrFlick/10413321) शानदार समारोह 'regcapturedmatches (परीक्षण, gregexpr ('एसटीआर 1 (। +?) एसटीआर 2', परीक्षण, perl = TRUE)) ' – rawr

उत्तर

18

आप str_matchSTR1 (.*?) STR2 के साथ उपयोग कर सकते हैं। यदि आपके पास कई घटनाएं हैं, तो str_match_all का उपयोग करें।

> library(stringr) 
> a<-" anything goes here, STR1 GET_ME STR2, anything goes here" 
> res <- str_match(a, "STR1 (.*?) STR2") 
> res[,2] 
[1] "GET_ME" 

एक और तरीका आधार आर regexec का उपयोग कर (पहला मैच पाने के लिए):

> test = " anything goes here, STR1 GET_ME STR2, anything goes here STR1 GET_ME2 STR2" 
> pattern="STR1 (.*?) STR2" 
> result <- regmatches(test,regexec(pattern,test)) 
> result[[1]][2] 
[1] "GET_ME" 
+0

यह काम करता है! प्रश्न चिह्न का उद्देश्य क्या है? ऐसा लगता है कि इसके बिना भी काम करता है। – Sasha

+0

'?' यहां एक आलसी * (गैर लालची) क्वांटिफायर का हिस्सा है। यह जितना संभव हो उतने पात्रों से मेल खाता है, जबकि '*' जितना संभव हो सके मिलान करेगा। तो, 'एसटीआर 1। *? एसटीआर 2 'रेगेक्स मैचों' एसटीआर 1 एक्सएक्स एसटीआर 2', और 'एसटीआर 1। * एसटीआर 2 '' एसटीआर 1 एक्सएक्स एसटीआर 2 ज़ेड एसटीआर 2' से मेल खाएगा। यदि आप अपने इनपुट में कई मैचों की अपेक्षा करते हैं, तो आलसी क्वांटिफायर यहां जरूरी है। इसके अलावा, एफवाईआई: यदि 'एसटीआर 1' और' एसटीआर 2' के बीच स्ट्रिंग का हिस्सा न्यूलाइन हो सकता है, तो आपको '(? एस) ':' "(एस) एसटीआर 1 (। *?) एसटीआर 2" के साथ पैटर्न को प्रीपेड करना होगा। । –