2017-12-06 33 views
6

मैं आर के कई संस्करणों को संतुलित कर रहा हूं और आर आर और कौन सी ऑपरेटिंग सिस्टम का उपयोग कर रहा हूं, इस पर निर्भर करता है कि मेरे आर पुस्तकालयों को लोड करना चाहता हूं। इस तरह, मैं आधार आर कार्यों के साथ रहना चाहता हूँ।आधार आर के साथ str_extract कैसे करें?

मैं देखना क्या stringr::str_extract के आधार आर बराबर था यह पेज पढ़ रहा था:

http://stat545.com/block022_regular-expression.html

यह सुझाव दिया मैं grep के साथ इस कार्यक्षमता को दोहराने सकता है। हालांकि, यदि कोई मैच है तो मैं पूरी स्ट्रिंग को वापस करने से अधिक करने के लिए grep प्राप्त करने में सक्षम नहीं हूं। क्या यह अकेले grep के साथ संभव है, या क्या मुझे इसे किसी अन्य फ़ंक्शन के साथ संयोजित करने की आवश्यकता है? मेरे मामले में मैं CentOS संस्करण 6 और 7.

grep(pattern = "release ([0-9]+)", x = readLines("/etc/system-release"), value = TRUE) 
+1

देखें https://stackoverflow.com/a/27274231/1017276 – Benjamin

+1

की है मुझे लगता है कि यह एक अच्छा विशिष्ट प्रश्न है कि एक जवाब (बजाय एक शिकार के रूप में बंद करने की तुलना में होना चाहिए, जब तक कि एक और सटीक मिलान मिल सकता है)। लेकिन कृपया एक अच्छा उदाहरण बनाएं जो पुन: उत्पन्न करने के लिए ओएस-विशिष्ट फ़ाइलों पर भरोसा नहीं करता है। हो सकता है कि कुछ उदाहरणों को '? Str_extract' में भी उधार लें। – Gregor

+0

सही उत्तर यह है: प्रत्येक रेगेक्स को आधार आर रेगेक्स कार्यों के उपयोग के लिए समायोजित किया जाना चाहिए। कोई सार्वभौमिक समाधान नहीं है। –

उत्तर

9

1) strcapture आप आधार का उपयोग कर "release 1.2.3" से अंक और डॉट्स की एक स्ट्रिंग को निकालने के लिए चाहते हैं, तो

x <- "release 1.2.3" 
strcapture("([0-9.]+)", x, data.frame(version = character(0))) 
## version 
## 1 1.2.3 

2) regexec/regmatches वहाँ भी regmatches और regexec लेकिन वह यह है कि पहले से ही एक और जवाब में शामिल किया गया है।

sub(".* ([0-9.]+).*", "\\1", x) 
## [1] "1.2.3" 

3a) क्या आप जानते मैच शुरुआत में है या तो के बाद या यह पहले सब कुछ हटा समाप्त करते हैं:

3) उप इसके अलावा यह अक्सर sub उपयोग करना संभव है

sub(".* ", "", x) 
## [1] "1.2.3" 

4) gsub कभी-कभी हम जानते हैं कि निकाले जाने वाले क्षेत्र में कुछ वर्ण हैं और वे el दिखाई नहीं देते हैं sewhere। एक अक्सर खेतों में इनपुट विघटित और फिर संख्या से या के माध्यम से वांछित एक भी सामना कर लेता)

gsub("[^0-9.]", "", x) 
## [1] "1.2.3" 

5 read.table: उस मामले में बस हर चरित्र की प्रत्येक पुनरावृत्ति कि स्ट्रिंग में नहीं किया जा सकता हटाना grepstrsplit, read.table या scan इस्तेमाल किया जा सकता:

read.table(text = x, as.is = TRUE)[[2]] 
## [1] "1.2.3" 

5a) ग्रेप/स्कैन

grep("^[0-9.]+$", scan(textConnection(x), what = "", quiet = TRUE), value = TRUE) 
## [1] "1.2.3" 

5 ब) ग्रेप/strsplit

grep("^[0-9.]+$", strsplit(x, " ")[[1]], value = TRUE) 
## [1] "1.2.3" 

6) सबस्ट्रिंग हैं हम चरित्र पीओ जानते हैं क्षेत्र के sition हम substring इस तरह उपयोग कर सकते हैं:

substring(x, 9) 
## [1] "1.2.3" 

6a) सबस्ट्रिंग/regexpr या हम regexpr उपयोग करने के लिए हमारे लिए चरित्र की स्थिति का पता लगाने में सक्षम हो सकता है:

substring(x, regexpr("\\d", x)) 
## [1] "1.2.3" 

7) read.dcf कभी-कभी इनपुट को डीसीएफ फॉर्म में कनवर्ट करना संभव है, जिस स्थिति में इसे read.dcf के साथ पढ़ा जा सकता है। इस तरह के डेटा प्रपत्र name: value

read.dcf(textConnection(sub(" ", ": ", x))) 
##  release 
## [1,] "1.2.3" 
2

के बीच अंतर करना आप कर सकता है

txt <- c("foo release 123", "bar release", "foo release 123 bar release 123") 
pattern <- "release ([0-9]+)" 
stringr::str_extract(txt, pattern) 
# [1] "release 123" NA   "release 123" 
sapply(regmatches(txt, regexec(pattern, txt)), "[", 1) 
# [1] "release 123" NA   "release 123" 
+0

ध्यान दें कि'regexec' के साथ पीसीआरई पैटर्न का उपयोग करना संभव नहीं है। 'स्ट्रिंगर रेगेक्स आईसीयू पर आधारित है और आधार आर टीआरई डिफ़ॉल्ट रेगेक्स इंजन नहीं करता है, जबकि चारों ओर देखो। –

+0

@ WiktorStribiżew अच्छा बिंदु। हालांकि, 'ट्रेल' तर्क को 'TRUE' पर सेट करना, कोई भी perl- संगत नियमित अभिव्यक्तियों का उपयोग कर सकता है। – lukeA

+0

@ WiktorStribiżew दस्तावेज के अनुसार 'regexec' 'perl = TRUE' का समर्थन करता है –

1
txt <- c("foo release 123", "bar release", "foo release 123 bar release 123") 
pattern <- "release ([0-9]+)" 

पहला मैच निकालें

sapply(
    X = txt, 
    FUN = function(x){ 
     tmp = regexpr(pattern, x) 
     m = attr(tmp, "match.length") 
     st = unlist(tmp) 
     if (st == -1){NA}else{substr(x, start = st, stop = st + m - 1)} 
    }, 
    USE.NAMES = FALSE) 
#[1] "release 123" NA   "release 123" 

निकालें कोशिश कर रहा हूँ सभी मैच

sapply(
    X = txt, 
    FUN = function(x){ 
     tmp = gregexpr(pattern, x) 
     m = attr(tmp[[1]], "match.length") 
     st = unlist(tmp) 
     if (st[1] == -1){ 
      NA 
     }else{ 
       sapply(seq_along(st), function(i) substr(x, st[i], st[i] + m[i] - 1)) 
      } 
    }, 
    USE.NAMES = FALSE) 
#[[1]] 
#[1] "release 123" 

#[[2]] 
#[1] NA 

#[[3]] 
#[1] "release 123" "release 123" 
संबंधित मुद्दे