2014-10-03 7 views
6

मैं एक एकल में एक वेक्टर के तत्वों के भीतर सभी एकाधिक (2 या अधिक) खाली स्थान के पात्रों को संक्षिप्त करने के कोशिश कर रहा था युक्त वैक्टर, के साथ मुद्दों, gsub() का उपयोग कर उदाहरण के लिए:आर regex: चरित्र NAS

x1 <- c(" abc", "a b c ", "a b c") 
gsub("\\s{2,}", " ", x1) 
[1] " abc" "a b c " "a b c" 

लेकिन जैसे जल्द ही के रूप वेक्टर NA शामिल प्रतिस्थापन विफल रहता है:

x2 <- c(NA, " abc", "a b c ", "a b c") 
gsub("\\s{2,}", " ", x2) 
[1] NA " " " " " " 

हालांकि, यह ठीक काम करता है अगर एक Perl- जैसे नियमित अभिव्यक्ति का उपयोग करता है:

gsub("\\s{2,}", " ", x2, perl = TRUE) 
[1] NA  " abc" "a b c " "a b c" 

क्या किसी के पास सुझाव है कि क्यों आर के नियमित नियमित अभिव्यक्ति इस तरह व्यवहार करते हैं? मैं लिनक्स x86-64 पर आर 3.1.1 का उपयोग कर रहा हूं अगर यह मदद करता है।

+0

आप अधिक बैक स्लैश जोड़ने की जाँच की थी? आर में यह काफी मुश्किल है। आपको आमतौर पर इस तरह के अभिव्यक्तियों को पहचानने के लिए तीन की आवश्यकता होती है – Llopis

+0

@Llopis यह गलत है। रेगेक्स वास्तव में '\ s' है, जिसके लिए हम '\\ s' पर पहुंचने के लिए एक बैकस्लैश तैयार करते हैं। – jbaums

+0

ओएस एक्स पर भी पुष्टि की गई। '' S' और '[[: space:]] 'व्यवहार को प्रदर्शित करते हैं, जबकि एक शाब्दिक अंतरिक्ष वर्ण (या स्थान/टैब वर्ण वर्ग) ठीक काम करता है। मैं आर –

उत्तर

2

मैंने सोर्स कोड पर पॉकेट नहीं किया है, लेकिन अगर आप useBytes=TRUE पैरामीटर (perl=TRUE पैरामीटर के बिना) का उपयोग करते हैं तो यह भी काम करता है। सहायता से: "यदि useBytesTRUE मिलान-दर-चरित्र के बजाय मिलान बाइट-बाय-बाइट किया जाता है।" यह हो सकता है कि यह gsub में विफल क्यों हो रहा है।

हालांकि, regexpr, regexec और gregexpr प्रत्येक सब सही पदों का पता लगाएं (मैं पठनीयता के लिए [[:space:]]: साथ \\s स्थानापन्न कर दिया है और केवल regexpr से उत्पादन का प्रयोग किया:।

regexpr("[[:space:]]{2,}", x2) 

## [1] NA 1 1 1 
## attr(,"match.length") 
## [1] NA 5 9 6 

तो, regex ही ठीक है

अद्यतन: आर 3.1.1 के grep.c में do_gsub पर एक त्वरित नज़र बहुत अंतर्दृष्टि नहीं मिली है (यह if/else कथन :-) का एक मोड़ भूलभुलैया है, लेकिन मैं लगभग कैल करना चाहता हूं यह एक बग है।

+2

क्या? रेगेक्स में एक बग? कोई कैसे बता सकता है? :-) –

1

बस इस प्रश्न को लपेटने के लिए: जैसा कि कई अन्य लोगों ने सुझाव दिया है, व्यवहार वास्तव में एक बग है। सूचना और यहाँ की पुष्टि की:

https://bugs.r-project.org/bugzilla/show_bug.cgi?id=16009

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