R में प्रमुख शून्य को हटाने के लिए Regex, जब तक कि अंतिम (या केवल) वर्ण शून्य न हो


9
gsub("(?<![0-9])0+", "", c("005", "0AB", "000", "0"), perl = TRUE)
#> [1] "5"  "AB" ""   ""
gsub("(^|[^0-9])0+", "\\1", c("005", "0AB", "000", "0"), perl = TRUE)
#> [1] "5"  "AB" ""   ""

उपरोक्त नियमित अभिव्यक्ति इस SO थ्रेड से है, जिसमें बताया गया है कि R में एक स्ट्रिंग से सभी प्रमुख शून्य को कैसे हटाया जाए । इस नियमित अभिव्यक्ति के परिणामस्वरूप "000" और "0" दोनों "" में रूपांतरित हो जाते हैं। इसके बजाय मैं पात्रों के एक स्ट्रिंग से सभी अग्रणी शून्य को हटाना चाहता हूं, केवल उन मामलों को छोड़कर जब अंतिम चरित्र शून्य होता है, या एकमात्र चरित्र शून्य होता है।

"005" would become "5"
"0AB" would become "AB"
"000" would become "0"
"0"   would become "0"

यह अन्य एसओ धागा बताता है कि मुझे क्या करना है, लेकिन मुझे नहीं लगता कि मुझे सिंटैक्स सही मिल रहा है, आर में समाधान लागू करना। और मैं वास्तव में नीचे दिए गए 1 और 2 के बीच के अंतर को नहीं समझता हूं ( अगर वे वास्तव में काम करते हैं)।

gsub("s/^0*(\d+)$/$1/;", "", c("005", "0AB", "000", "0"), perl = TRUE)  # 1st solution
# Error: '\d' is an unrecognized escape in character string starting ""s/^0*(\d"
gsub("s/0*(\d+)/$1/;", "", c("005", "0AB", "000", "0"), perl = TRUE)    # 2nd solution
# Error: '\d' is an unrecognized escape in character string starting ""s/0*(\d"

आर में उचित रेगेक्स क्या है जो मुझे चाहिए?

जवाबों:


6

आप एक स्ट्रिंग की शुरुआत से सभी शून्य हटा सकते हैं लेकिन अंतिम नहीं:

sub("^0+(?!$)", "", x, perl=TRUE)

रेगेक्स डेमो देखें ।

विवरण

  • ^ - एक स्ट्रिंग की शुरुआत
  • 0+ - एक या एक से अधिक शून्य
  • (?!$) - एक नकारात्मक लुकहेड जो मैच को विफल करता है अगर वर्तमान स्थान के दाईं ओर स्ट्रिंग स्थिति का अंत है

आर डेमो देखें :

x <- c("005", "0AB", "000", "0")
sub("^0+(?!$)", "", x, perl=TRUE)
## => [1] "5"  "AB" "0"  "0"

1
regexअनाडी। प्रदर्शन अंतर (या अन्य वरीयताओं) अपने पैटर्न और इस एक के बीच क्या है ^0*(.+)$या ^0+(.+)$?
एमटी

2
@ एम-- ये अलग-अलग पैटर्न हैं, यह केवल समान रेगेक्स के प्रदर्शन की तुलना करने के लिए अनुशंसित है। तुम्हारा थोड़ा सा अशुभ .हो सकता है क्योंकि 0दोनों मैच कर सकते हैं और दोनों आस-पास के पैटर्न अनिश्चित काल के लिए निर्धारित हैं, लेकिन बस थोड़ा सा।
विकटोरिया स्ट्राइब्यू

4

हम एक या अधिक शून्य के बाद किसी भी गैर-शून्य मान की जांच करने के लिए एक regex लुकअप के साथ एक और शर्त जोड़ सकते हैं ( 0+)

sub("(?<![0-9])0+(?=[^0])", "", sub("^0+$", "0", v1), perl = TRUE)
#[1] "5"  "AB" "0"  "0" 

डेटा

v1 <- c("005", "0AB", "000", "0")

1
मैं regexकिसी भी तरह से गुरु नहीं हूं लेकिन लुकआर्ड्स कुशल नहीं हैं, क्या वे हैं? चूंकि आपके पास दो हैं subआप सभी प्रमुख शून्य को हटा सकते हैं और ""साथ बदल सकते हैं 0? sub("^$", "0", sub("^0+", "", v1), perl = TRUE)
M--

2
@ एम-- यह उतना कुशल नहीं होगा, लेकिन मैंने इसे ओपी के समान कोड का पालन करने के लिए इस्तेमाल किया
अकरुन


3

आप या तो एक कैप्चरिंग ग्रुप में स्ट्रिंग में सभी जीरो से मिलान करने के लिए एक विकल्प का उपयोग कर सकते हैं या स्ट्रिंग की शुरुआत से सभी जीरो से मिलान कर सकते हैं।

प्रतिस्थापन उपयोग समूह 1 में।

^0*(0)$|^0+

रेगेक्स डेमो | आर डेमो

उदाहरण के लिए

sub("^0*(0)$|^0+", "\\1", c("005", "0AB", "000", "0"))

उत्पादन

[1] "5"  "AB" "0"  "0"

या इससे भी बेहतर के रूप में Wiktor Stribi , ew द्वारा टिप्पणी की गई , आप एक समूह में एक 0 पर कब्जा कर सकते हैं और एक शून्य के अंतिम उदाहरण पर कब्जा करने के लिए समूह को ही दोहरा सकते हैं।

^(0)+$|^0+

रेगेक्स डेमो


3
मैं उपयोग करूँगा^(0)+$|^0+
विकटोरिया Stribiżew

3
ऐसा लगता है कि sub("^0+(?!$)", "", x, perl=TRUE)यह भी काम करेगा
विकटोरिया Stribi Decew

2

एक अन्य regexविकल्प:

^0*(.+)$

यहाँ एक रेगीक्स डेमो है

base::subआर में उपयोग :

sub("^0*(.+)$", "\\1", c("005", "0AB", "000", "0"))  

 ## [1] "5"  "AB" "0"  "0" 

यहाँ एक आर डेमो है

या @ अक्रुन के उत्तर पर विस्तार :

sub("^$", "0", sub("^0+", "", c("005", "0AB", "000", "0")), perl = TRUE)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.