正则表达式删除 R 中的前导零,除非最后一个(或唯一的)字符为零

Jas*_*ter 9 regex string r gsub stringr

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" ""   ""
Run Code Online (Sandbox Code Playgroud)

上面的正则表达式来自这个 SO 线程,解释了如何从 R 中的字符串中删除所有前导零。作为这个正则表达式的结果,“000”和“0”都被转换为“”。相反,我想从字符串中删除所有前导零,除了最后一个字符恰好为零或唯一字符为零的情况。

"005" would become "5"
"0AB" would become "AB"
"000" would become "0"
"0"   would become "0"
Run Code Online (Sandbox Code Playgroud)

另一个 SO 线程解释了如何做我想做的事,但我认为我的语法不太正确,在 R 中应用解决方案。而且我真的不明白下面第一个和第二个解决方案之间的区别(如果它们确实有效)。

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"
Run Code Online (Sandbox Code Playgroud)

R 中的正确正则表达式是什么才能得到我想要的?

Wik*_*żew 6

您可以删除字符串开头的所有零,但不能删除最后一个:

sub("^0+(?!$)", "", x, perl=TRUE)
Run Code Online (Sandbox Code Playgroud)

请参阅正则表达式演示

细节

  • ^ - 字符串的开始
  • 0+ - 一个或多个零
  • (?!$) - 如果在当前位置的右侧有字符串结尾位置,则匹配失败的负前瞻

请参阅R 演示

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

  • @M--这些是不同的模式,建议仅比较等效正则表达式的性能。你的效率有点低,因为“.”可以匹配“0”,并且两个相邻的模式都是无限量化的,但只是一点点。 (2认同)