2014-04-07 8 views
6

के बीच स्ट्रिंग का हिस्सा निकालें I स्ट्रिंग के हिस्से को निकालने के लिए stringr पैकेज का उपयोग करने का प्रयास करें, जो दो विशेष पैटर्न के बीच है।दो अलग-अलग पैटर्न

उदाहरण के लिए, मेरे पास है:

my.string <- "nanaqwertybaba" 
left.border <- "nana" 
right.border <- "baba" 

और str_extract(string, pattern) समारोह मैं प्राप्त करना चाहते हैं (जहां पैटर्न एक POSIX नियमित अभिव्यक्ति द्वारा परिभाषित किया गया है) के उपयोग के द्वारा:

"qwerty" 

Google से समाधान काम नहीं किया।

उत्तर

8

मैं कि क्या और कैसे इस stringr द्वारा प्रदान कार्यों के साथ संभव है पता नहीं है, लेकिन आप भी आधार regexpr और substring उपयोग कर सकते हैं:

pattern <- paste0("(?<=", left.border, ")[a-z]+(?=", right.border, ")") 
# "(?<=nana)[a-z]+(?=baba)" 

rx <- regexpr(pattern, text=my.string, perl=TRUE) 
# [1] 5 
# attr(,"match.length") 
# [1] 6 

substring(my.string, rx, rx+attr(rx, "match.length")-1) 
# [1] "qwerty" 
+0

धन्यवाद, sigbb! मैंने इसे थोड़ा सा समायोजित किया है, ताकि: 1. 'left.border' और' right.border' के बीच सभी वर्णों से मेल खाएं, 2. 'right.border' के पहले अवसर पर मिलान करें और अब मेरे पास है:' आरएक्स <- regexpr (paste0 ("(? <=", left.border, ") (। *?) + (? =", right.border, ")"), text = my.string, perl = TRUE) '। आपको धन्यवाद! –

14

base में आर आप gsub उपयोग कर सकते हैं। pattern में कोष्ठक क्रमांकित कैप्चरिंग समूह बनाते हैं। यहां हम replacement में दूसरे समूह का चयन करते हैं, यानी सीमाओं के बीच समूह। . किसी भी चरित्र से मेल खाता है। * का मतलब शून्य या पूर्ववर्ती तत्व

gsub(pattern = "(.*nana)(.*)(baba.*)", 
    replacement = "\\2", 
    x = "xxxnanaRisnicebabayyy") 
# "Risnice" 
+0

ठीक है, मुद्दा यह है कि मुझे नहीं पता कि "qwerty" यहां बैठता है, क्या मैं इसे रेगेक्स पैटर्न में उपयोग करने का कोई तरीका नहीं है! –

+0

@Marciszka: आप इस उदाहरण में नियमित अभिव्यक्ति के साथ "qwerty" को प्रतिस्थापित कर सकते हैं, उदा। 'gsub (pattern =" (। * nana) ([[: अल्फा:]] +) (बाबा। *) "," \\ 2 ", x = my.string) 'कम से कम एक अक्षर के लिए। – sgibb

5

मैं stringr से str_match का प्रयोग करेंगे की अधिक है कि वहाँ: "str_match () पहले मैच से द्वारा गठित कैप्चर समूहों के अर्क यह के साथ एक चरित्र मैट्रिक्स देता है। पूरे मैच के लिए एक कॉलम और प्रत्येक समूह के लिए एक कॉलम। " ref

str_match(my.string, paste(left.border, '(.+)', right.border, sep=''))[,2] 

कोड ऊपर paste कैप्चर समूह (.+) कि बाएँ और दाएँ सीमाओं के साथ 1 या अधिक वर्ण, (तार के बीच कोई रिक्ति नहीं) कब्जा श्रृंखलाबद्ध के साथ एक नियमित अभिव्यक्ति पैदा करता है।

एक एकल मैच माना जाता है। तो, [,2]str_match द्वारा लौटाए गए मैट्रिक्स से दूसरा कॉलम चुनता है।

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