2012-08-31 21 views
10

के साथ पीछे की अवधि को प्रतिस्थापित करें। मेरे पास आर में रेगेक्स के साथ एक अजीब अनुरोध है। मेरे पास चरित्र तारों का वेक्टर है जहां कुछ में कई पिछली अवधि होती है। मैं इन अवधि को रिक्त स्थान से बदलना चाहता हूं। उदाहरण और वांछित परिणाम स्पष्ट है कि मैं क्या कर रहा हूँ बनाना चाहिए के बाद (शायद मैं मैं क्या gsub के पैटर्न तर्क तर्क के बजाय बदलने के लिए देने के साथ यह हमला करने के लिए की जरूरत है):रिक्त स्थान

उदाहरण और प्रयास:

x <- c("good", "little.bad", "really.ugly......") 
gsub("\\.$", " ", x) 
    #produces this 
    #[1] "good"    "little.bad"  "really.ugly..... " 
gsub("\\.+$", " ", x) 
    #produces this 
    #[1] "good"   "little.bad" "really.ugly " 

वांछित परिणाम

[1] "good"    "little.bad"  "really.ugly  " 

तो मूल सदिश (एक्स) अंत में 6 समय के साथ अंतिम स्ट्रिंग था तो मैं 6 स्पा चाहते हैं वास्तव में और बदसूरत के बीच की अवधि को छूए बिना सीईएस। मुझे पता है कि $ अंत में दिखता है लेकिन यह पिछले नहीं हो सकता है।

उत्तर

16

इस प्रयास करें:

gsub("\\.(?=\\.*$)", " ", mystring, perl=TRUE) 

स्पष्टीकरण:

\. # Match a dot 
(?= # only if followed by 
\.* # zero or more dots 
$ # until the end of the string 
) # End of lookahead assertion. 
+0

मुझे 'अवैध नियमित अभिव्यक्ति 'मिल रही है \। (? = \। * $)', कारण 'अमान्य regexp' –

+0

@ डेविड रॉबिन्सन: एक स्ट्रिंग के अंदर, आपको बैकस्लाश को दोगुनी करने की आवश्यकता है। –

+2

+1 मैंने यह दिखाने के लिए आपका जवाब संपादित किया कि यह आर – Andrie

2

मैं एक regex समाधान इस संदर्भ में मैं इस का समाधान करने के लिए एक अतर्कसंगत तरह से साथ आने का फैसला किया है बनाता है के लिए इंतजार कर रहे थे जबकि:

messy.sol <- function(x) { 
paste(unlist(list(gsub("\\.+$", "", x), 
    rep(" ", nchar(x) - nchar(gsub("\\.+$", "", x))))),collapse="") 
} 

sapply(x, messy.sol, USE.NAMES = FALSE) 

मैं कहूंगा कि टिम थोड़ा सुंदर है :)

+0

+1 जब तक यह काम करता है;) –

2

टिम का समाधान स्पष्ट रूप से बेहतर है लेकिन मुझे लगा कि मैं वैकल्पिक रूप से अपना हाथ आजमाऊंगा। regmatches के उदारवादी उपयोग का उपयोग करना हमें बाहर यहाँ

x <- c("good", "little.bad", "really.ugly......") 
# Get an object with 'match data' to feed into regmatches 
# Here we match on any number of periods at the end of a string 
out <- regexpr("\\.*$", x) 

# On the right hand side we extract the pieces of the strings 
# that match our pattern with regmatches and then replace 
# all the periods with spaces. Then we use assignment 
# to store that into the spots in our strings that match the 
# regular expression. 
regmatches(x, out) <- gsub("\\.", " ", regmatches(x, out)) 
x 
#[1] "good"    "little.bad"  "really.ugly  " 

तो काफी के रूप में एक नियमित अभिव्यक्ति के रूप में साफ नहीं मदद करता है। लेकिन मैंने वास्तव में उन 'लुकहेड इन पर्ल नियमित अभिव्यक्तियों को सीखने के लिए कभी नहीं मिला है।

+0

टिम के रूप में साफ नहीं है लेकिन अभी भी एक अच्छा समाधान है (विशेष रूप से मेरे स्वयं की तुलना में)। +1 –

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