正则表达式删除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" ""   ""

上面的正则表达式来自此SO线程,它说明了如何从R中的字符串中删除所有前导零。由于此正则表达式,“ 000”和“ 0”都转换为“”。相反,我想从字符串中删除所有前导零,但最终字符恰好为零或唯一字符为零的情况除外。

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

另一个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"

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

Answers:


6

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

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

参见regex演示

细节

  • ^ -字符串开头
  • 0+ -一个或多个零
  • (?!$) -如果当前位置的右侧紧跟着字符串位置的末尾,则负匹配将使匹配失败

参见R演示

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

1
regex菜鸟。什么是你的模式,这其中的性能差异(或其他偏好)^0*(.+)$^0+(.+)$
M–

2
@ M--这些是不同的模式,建议仅比较等效正则表达式的性能。您的.匹配效率有点低下,0并且两个相邻的模式都可以无限量化,但是只有一点点。
维克多·斯特里比维(WiktorStribiżew)

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您可能要删除所有前导零并替换""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żew,

3
看起来sub("^0+(?!$)", "", x, perl=TRUE)也可以使用
WiktorStribiżew19年

2

另一种regex选择:

^0*(.+)$

这是一个正则表达式演示

base::sub在R中使用:

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)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.