最後の(または唯一の)文字がゼロでない限り、Rの先行ゼロを削除する正規表現


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

上記の正規表現、Rの文字列からすべての先行ゼロを削除する方法を説明するこのSOスレッドからのものです。この正規表現の結果として、「000」と「0」は両方とも「」に変換されます。代わりに、最後の文字が偶然ゼロである場合、または唯一の文字がゼロである場合を除いて、文字列からすべての先行ゼロを削除します。

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

この別のSOスレッドは私がやりたいことを行う方法を説明していますが、Rのソリューションを適用して構文が完全に正しいとは思いません。また、以下の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"

私が欲しいものを得るためのRの適切な正規表現は何ですか?

回答:


6

文字列の最初からすべてのゼロを削除できますが、最後のゼロは削除できません。

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

正規表現のデモをご覧ください。

細部

  • ^ -文字列の開始
  • 0+ -1つ以上のゼロ
  • (?!$) -現在の位置のすぐ右側に文字列の終わりの位置がある場合、一致に失敗する負の先読み

Rデモを見る:

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

1
regex新入り。あなたのパターンと、この1の性能差(または他の好み)何^0*(.+)$かが^0+(.+)$
M--

2
@ M--これらは異なるパターンです。同等の正規表現のパフォーマンスのみを比較することをお勧めします。あなたのパターンは.一致0する可能性があるため少し非効率的であり、隣接する両方のパターンは無期限に定量化されますが、ほんの少しです。
WiktorStribiżew19年

4

正規表現のルックアラウンドを使用して1つ以上の条件を追加し、1つ以上のゼロ(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グルではありませんが、ルックアラウンドは効率的ではありませんか?あなたは2を持っているのでsub、あなたはすべての先行ゼロを取り外して交換することをお勧めします""0sub("^$", "0", sub("^0+", "", v1), perl = TRUE)
M--

2
@ M--それはそれほど効率的ではありませんが、OPと同じコードに従うために使用しました
akrun


3

代替を使用して、キャプチャグループ内の文字列のすべてのゼロに一致させるか、文字列の先頭からすべてのゼロに一致させることができます。

代替使用グループ1。

^0*(0)$|^0+

正規表現のデモ | Rデモ

例えば

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

出力

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

または、WiktorStribiżewのコメントのように、グループ内の単一の0をキャプチャーし、グループ自体を繰り返してゼロの最後のインスタンスをキャプチャーすることもできます。

^(0)+$|^0+

正規表現のデモ


3
使用します^(0)+$|^0+
WiktorStribiżew19年

3
sub("^0+(?!$)", "", x, perl=TRUE)
うまく

2

別のregexオプション:

^0*(.+)$

これが正規表現のデモです。

base::subRでの使用:

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

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

これがRデモです。

または@akrunの答えを拡張する:

sub("^$", "0", sub("^0+", "", c("005", "0AB", "000", "0")), perl = TRUE)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.