2011-08-04 13 views
17

मैं, देखने के लिए अगर "001" या "100" या "000"0 और 1 के 4 वर्णों की स्ट्रिंग में होता है चाहता हूँ का उपयोग कर विभिन्न संभावनाओं के साथ एक स्ट्रिंग मिलान। उदाहरण के लिए, एक 4 वर्ण स्ट्रिंग "1100" या "0010" या "1001" या "1111" जैसी हो सकती है। मैं एक स्ट्रिंग में स्ट्रिंग में कई स्ट्रिंग्स से कैसे मेल करूं?ग्रेप

मुझे पता है कि grep पैटर्न मिलान के लिए उपयोग किया जा सकता है, लेकिन grep का उपयोग करके, मैं एक समय में केवल एक स्ट्रिंग देख सकता हूं। मैं जानना चाहता हूं कि कई स्ट्रिंग्स का इस्तेमाल किसी अन्य कमांड या जीईपी के साथ किया जा सकता है।

उत्तर

37

हाँ, आप कर सकते हैं। |grep पैटर्न में or जैसा ही अर्थ है। तो आप अपने पैटर्न के रूप में "001|100|000" का उपयोग कर अपने पैटर्न के लिए परीक्षण कर सकते हैं। इसी समय, grep vectorised है, इसलिए इस का एक ही चरण में किया जा सकता है: (। इस मामले में पहले तीन)

x <- c("1100", "0010", "1001", "1111") 
pattern <- "001|100|000" 

grep(pattern, x) 
[1] 1 2 3 

यह एक सूचकांक अपने वैक्टर की जिनमें से मेल खाते नमूने निहित रिटर्न

कभी-कभी लॉजिकल वेक्टर रखना अधिक सुविधाजनक होता है जो आपको बताता है कि आपके वेक्टर में कौन से तत्व मिलान किए गए थे। तो फिर तुम grepl उपयोग कर सकते हैं:

grepl(pattern, x) 
[1] TRUE TRUE TRUE FALSE 

नियमित अभिव्यक्ति के बारे में मदद के लिए ?regex देखें आर में


संपादित करें: पैटर्न का निर्माण से बचने के लिए मैन्युअल रूप से हम paste उपयोग कर सकते हैं:

myValues <- c("001", "100", "000") 
pattern <- paste(myValues, collapse = "|") 
+0

@andrie, यह बिल्कुल शानदार है, यह मान रहा था कि यह वर्षों के लिए असंभव है, जबकि यह सिर्फ एक साधारण रेगेक्स है,

+4

@ डेविड एडिनबर्ग :-) मैंने कड़वी अनुभव से सीखा है कि आर में कुछ भी असंभव नहीं है। यह हमेशा एक प्रश्न है किस तरह! – Andrie

2

अतिरिक्त पैटर्न जोड़ने के लिए -e तर्क का उपयोग करें:

echo '1100' | grep -e '001' -e '110' -e '101' 
+2

मुझे खेद है, लेकिन मैं यह उल्लेख करना भूल गया कि मैं इसे आर – Narayani

+0

में करना चाहता हूं, यह वैसे भी उपयोगी है। – marbel

6

यहांका उपयोग कर एक समाधान है 0 पैकेज

require(stringr) 
mylist = c("1100", "0010", "1001", "1111") 
str_locate(mylist, "000|001|100") 
1

तुम भी data.table पुस्तकालय से %like% ऑपरेटर का उपयोग कर सकते हैं।

library(data.table) 

# input 
    x <- c("1100", "0010", "1001", "1111") 
    pattern <- "001|100|000" 

# check for pattern 
    x %like% pattern 

> [1] TRUE TRUE TRUE FALSE 
+0

ध्यान दें कि '% की तरह%' 'grepl' के लिए सिर्फ एक रैपर है,'%% की तरह% 'जांचें" तर्क: ... \t पैटर्न \t grepl पर पास किया गया। "। कम से कम 'data.table' संस्करण 1.10.4-2 तक। –

1

आप तार्किक वेक्टर चाहते हैं तो आपको stringi पैकेज से stri_detect समारोह जांच होनी चाहिए। आपके मामले में पैटर्न, regex है तो यह एक का उपयोग करें:

stri_detect_regex(x, pattern) 
## [1] TRUE TRUE TRUE FALSE 

और कुछ मानक: यह एक अतिरिक्त जवाब बनाने के लिए

require(microbenchmark) 
test <- stri_paste(stri_rand_strings(100000, 4, "[0-1]")) 
head(test) 
## [1] "0001" "1111" "1101" "1101" "1110" "0110" 
microbenchmark(stri_detect_regex(test, pattern), grepl(pattern, test)) 
Unit: milliseconds 
          expr  min  lq  mean median  uq  max neval 
stri_detect_regex(test, pattern) 29.67405 30.30656 31.61175 30.93748 33.14948 35.90658 100 
      grepl(pattern, test) 36.72723 37.71329 40.08595 40.01104 41.57586 48.63421 100 
0

क्षमा करें, लेकिन यह एक टिप्पणी के लिए बहुत सारी पंक्तियां है।

मैं बस याद दिलाना चाहता था कि paste(..., collapse = "|") के माध्यम से एक मिलान मिलान पैटर्न के रूप में उपयोग किए जाने वाले आइटमों की संख्या सीमित है - नीचे देखें। शायद कोई बता सकता है कि सीमा कहां है? माना जाता है कि संख्या यथार्थवादी नहीं हो सकती है, लेकिन किए जाने वाले कार्य के आधार पर इसे पूरी तरह से हमारे विचारों से बाहर नहीं किया जाना चाहिए।

वास्तव में बड़ी संख्या में वस्तुओं के लिए, पैटर्न के प्रत्येक आइटम को जांचने के लिए एक लूप की आवश्यकता होगी।

set.seed(0) 
samplefun <- function(n, x, collapse){ 
    paste(sample(x, n, replace=TRUE), collapse=collapse) 
} 

words <- sapply(rpois(10000000, 8) + 1, samplefun, letters, '') 
text <- sapply(rpois(1000, 5) + 1, samplefun, words, ' ') 

#since execution takes a while, I have commented out the following lines 

#result <- grepl(paste(words, collapse = "|"), text) 

# Error in grepl(pattern, text) : 
# invalid regular expression 
# 'wljtpgjqtnw|twiv|jphmer|mcemahvlsjxr|grehqfgldkgfu| 
# ... 

#result <- stringi::stri_detect_regex(text, paste(words, collapse = "|")) 

# Error in stringi::stri_detect_regex(text, paste(words, collapse = "|")) : 
# Pattern exceeds limits on size or complexity. (U_REGEX_PATTERN_TOO_BIG) 
संबंधित मुद्दे