2017-03-01 4 views
5

द्वारा बंधे अल्पविराम पर नियमित अभिव्यक्ति मिलान, मैं अन्य अल्पविरामों को छूने के दौरान, एक सफेद स्थान के साथ nonwhite स्थान से घिरे अल्पविरामों को प्रतिस्थापित करने की कोशिश कर रहा हूं।गैर-हाइट स्पेस

कल्पना कीजिए कि मेरे पास है:

j<-"Abc,Abc, and c" 

और मैं चाहता हूँ:

"Abc Abc, and c" 

यह लगभग काम करता है:

gsub("[^ ],[^ ]"," " ,j) 

लेकिन यह वर्ण देना करने के लिए अल्पविराम के दोनों ओर निकालता है:

"Ab bc, and c" 

उत्तर

5

आप एक नकारात्मक lookbehind और अग्रदर्शी के साथ एक PCRE regex का उपयोग हो सकता है:

j <- "Abc,Abc, and c" 
gsub("(?<!\\s),(?!\\s)", " ", j, perl = TRUE) 
## => [1] "Abc Abc, and c" 

regex demo

विवरण देखें:

  • (?<!\\s) - एक शाब्दिक ,
  • (?!\\s) - - वहाँ नहीं एक ,
  • , से पहले एक खाली स्थान के सही हो सकता है एक खाली स्थान के वहीं नहीं हो सकता एक ,

एक वैकल्पिक समाधान है के बाद एक , मिलान करने के लिए कि शब्द सीमाओं से घिरा हुआ है:

j <- "Abc,Abc, and c" 
gsub("\\b,\\b", " ", j) 
## => [1] "Abc Abc, and c" 

देखें।

+0

इस कार्यात्मक रूप से बराबर है: '", (= \\ एस?) (<= \\ एस?) "'? – nrussell

+1

नहीं, नकारात्मक लुकराउंड सकारात्मक लोगों के बराबर नहीं हैं क्योंकि सकारात्मक रूपरेखाओं को पैटर्न की उपस्थिति की आवश्यकता होती है। आम तौर पर, अंतर स्ट्रिंग पोजिशन के प्रारंभ/अंत में देखा जाता है। '(? <= \ S) 'को अगले उप-पैटर्न से पहले एक गैर-व्हाइटस्पेस की आवश्यकता होती है, इस प्रकार, स्ट्रिंग की शुरुआत में कोई मिलान नहीं होगा। '(?

+0

वाह, त्वरित उत्तर और सही उत्तर के लिए धन्यवाद! – tsutsume

3

आप इस तरह के संदर्भ वापस का उपयोग कर सकते हैं:

gsub("([^ ]),([^ ])","\\1 \\2" ,j) 
[1] "Abc Abc, and c" 

() नियमित अभिव्यक्ति में पात्रों अल्पविराम से सटे पर कब्जा। \\1 और \\2 इन कैप्चर किए गए मानों को कैद किए गए क्रम में वापस कर दें।

3

हम कोशिश कर सकते हैं

gsub(",(?=[^ ])", " ", j, perl = TRUE) 
#[1] "Abc Abc, and c" 
0

शायद यह भी काम करता है:

library("stringr") 
j<-"Abc,Abc, and c" 
str_replace(j,"(\\w+),([\\w]+)","\\1 \\2") 
संबंधित मुद्दे