2012-10-17 15 views
10

में पाइप ("|") से बचने के लिए मुझे शब्दों और अंत अंक (कुछ प्रकार के विराम चिह्न) पर विभाजित करने की आवश्यकता है। अजीब पाइप ("|") एक अंतिम निशान के रूप में गिना जा सकता है। मेरे पास कोड है जो अंत अंक पर शब्द जब तक कि मैं पाइप जोड़ने की कोशिश नहीं करता। पाइप जोड़ने से प्रत्येक चरित्र strsplit बनाता है। इससे बचने और त्रुटि से बचें। मैं नियमित अभिव्यक्ति को पाइप int कैसे शामिल कर सकता हूं?एक रेगेक्स

x <- "I like the dog|." 

strsplit(x, "[[:space:]]|(?=[.!?*-])", perl=TRUE) 
#[[1]] 
#[1] "I" "like" "the" "dog|" "." 

strsplit(x, "[[:space:]]|(?=[.!?*-\|])", perl=TRUE) 
#Error: '\|' is an unrecognized escape in character string starting "[[:space:]]|(?=[.!?*-\|" 

परिणाम मैं चाहता हूँ:

#[[1]] 
#[1] "I" "like" "the" "dog" "|" "." #pipe is an element 
+0

मैं हमेशा क्योंकि आप अन्य भाषाओं से regexers हो और यद्यपि जवाब समान हैं वे ओवरलैप नहीं आर regex सवाल पर regex टैग डाल करने के लिए संकोच कर रहा हूँ। –

उत्तर

16

एक तरह से ... में पात्रों में से किसी का विशेष अर्थ को दूर करने के \Q...\E संकेतन का उपयोग करने के लिए है। यह ?regex में कहते हैं:

आप वर्णों का एक क्रम से विशेष अर्थ निकालना चाहते हैं, तो आप उन्हें '\ क्यू' और '\ ई' के बीच रख कर ऐसा कर सकते हैं। यह उस '$' और '@' में पर्ल से अलग है '\ Q ... \ E' पीसीआरई में अनुक्रमों के रूप में, जबकि पर्ल, '$' और '@' कारण परिवर्तनीय इंटरपोलेशन में।

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

> strsplit(x, "[[:space:]]|(?=[\\Q.!?*-|\\E])", perl=TRUE) 
[[1]] 
[1] "I" "like" "the" "dog" "|" "." 
+0

दिलचस्प के लिए धन्यवाद। मुझे निश्चित रूप से कुछ और regex पर पढ़ने की जरूरत है। +1 – A5C1D2H2I1M1N2O1R2T1

+0

@ जोशुआ, mrdwab ने एक अच्छा जवाब दिया और यह और भी गहन है। मैंने कभी भी \\ क्यू ... \\ ई' चीज़ के बारे में भी नहीं सुना। बहुत उपयोगी जानकारी। –

+0

@ टाइलर रिंकर: जब तक मैं आपका प्रश्न देखने के बाद प्रलेखन नहीं पढ़ता, तब तक मैंने कभी इसके बारे में कभी नहीं सुना होगा। ;-) –

12

समस्या वास्तव में अपने हाइफन, जो या तो आना चाहिए first or last है:

strsplit(x, "[[:space:]]|(?=[|.!?*-])", perl=TRUE) 
strsplit(x, "[[:space:]]|(?=[.|!?*-])", perl=TRUE) 
strsplit(x, "[[:space:]]|(?=[.!|?*-])", perl=TRUE) 
strsplit(x, "[[:space:]]|(?=[-|.!?*])", perl=TRUE) 

और इतने पर आप सभी की उत्पादन देना चाहिए आप क्या देख रहे हैं।

यदि आप चाहें तो आप हाइफ़न से भी बच सकते हैं, लेकिन दो बैकस्लेश का उपयोग करना याद रखें! इस को हल करने के

strsplit(x, "[[:space:]]|(?=[.!?*\\-|])", perl=TRUE) 
+0

दोनों उत्कृष्ट उत्तरों, जोश ने और भी विस्तार दिया। आपके उत्तर +1 –