চূড়ান্ত (বা কেবল) অক্ষরটি শূন্য না হওয়া পর্যন্ত আর-তে শীর্ষস্থানীয় শূন্যগুলি সরিয়ে নেওয়ার জন্য রেজেক্স


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" ""   ""

উপরের নিয়মিত এক্সপ্রেশনটি এই এসও থ্রেড থেকে ব্যাখ্যা করে যে কীভাবে আর এর স্ট্রিং থেকে সমস্ত নেতৃস্থানীয় শূন্যগুলি সরিয়ে ফেলা যায়। এই নিয়মিত অভিব্যক্তির ফলস্বরূপ "000" এবং "0" উভয়ই "" রূপান্তরিত হয় "। পরিবর্তে আমি চূড়ান্ত অক্ষর শূন্য হয় বা একমাত্র অক্ষর শূন্য হয় এমন ক্ষেত্রে বাদে অক্ষরের একটি স্ট্রিং থেকে সমস্ত নেতৃস্থানীয় শূন্যগুলি মুছে ফেলতে চাই।

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

এই অন্যান্য এসও থ্রেডটি আমি যা চাই তা কীভাবে করব তা ব্যাখ্যা করে, তবে আমি মনে করি না যে আমি বাক্য গঠনটি বেশ সঠিকভাবে পেয়েছি, আরটিতে সমাধানটি প্রয়োগ করে And এবং আমি নীচের 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)

দেখুন Regex ডেমো

বিস্তারিত

  • ^ - একটি স্ট্রিং শুরু
  • 0+ - এক বা একাধিক শূন্য
  • (?!$) - বর্তমান অবস্থানের ডানদিকে অবিলম্বে স্ট্রিং পজিশনের সমাপ্তি হলে ম্যাচটি ব্যর্থ হয় এমন একটি নেতিবাচক চেহারা

দেখুন আর ডেমো :

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

1
regexঅনভিজ্ঞ. আপনার নিদর্শন এবং এই এক ^0*(.+)$বা এর মধ্যে পারফরম্যান্স পার্থক্য (বা অন্যান্য পছন্দগুলি) ^0+(.+)$কী?
এম--

2
@ এম-- এগুলি বিভিন্ন ধরণের, এটি কেবলমাত্র সমতুল্য রেজেক্সপগুলির পারফরম্যান্সের সাথে তুলনা করার পরামর্শ দেওয়া হয়। আপনার .ম্যাচ করা যায় ঠিক তেমন অদক্ষ 0এবং উভয় সংলগ্ন নিদর্শন অনির্দিষ্টকালের জন্য মাপসই, তবে কেবল সামান্য একটি।
উইক্টর স্ট্রিবিউ

4

এক বা একাধিক শূন্যের পরে কোনও শূন্য-না মান মান পরীক্ষা করার জন্য আমরা একটি রেজেক্স বর্ণনাকারীর সাথে আরও একটি শর্ত যুক্ত করতে পারি ( 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)
এম--

2
@ এম-- এটি দক্ষ হবে না তবে আমি ওপি হিসাবে একই কোড অনুসরণ করতে এটি ব্যবহার করেছি
আকরুন


3

আপনি ক্যাপচারিং গ্রুপের স্ট্রিংয়ের সমস্ত শূন্যের সাথে মেলে বা স্ট্রিংয়ের শুরু থেকে সমস্ত শূন্যের সাথে মেলে একটি বিকল্প ব্যবহার করতে পারেন।

প্রতিস্থাপন ব্যবহার গ্রুপ 1।

^0*(0)$|^0+

রেজেক্স ডেমো | আর ডেমো

উদাহরণ স্বরূপ

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

আউটপুট

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

অথবা আরও ভাল উইক্টর স্ট্রিবিউ দ্বারা মন্তব্য করা হিসাবে , আপনি একটি গ্রুপে একটি 0 ক্যাপচার ব্যবহার করতে পারেন এবং একটি শূন্যের শেষ ঘটনাটি ক্যাপচার করার জন্য গ্রুপটি নিজেই পুনরাবৃত্তি করতে পারেন।

^(0)+$|^0+

রেজেক্স ডেমো


3
আমি ব্যবহার করব^(0)+$|^0+
উইক্টর স্ট্রিবিউউ

3
দেখে মনে হচ্ছে sub("^0+(?!$)", "", x, perl=TRUE)এটিও কাজ করবে
উইক্টর স্ট্রিবিউ

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)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.