从字符串开头删除前导零

6

我首先参考了这个问题,但答案并没有帮助到我的情况。

我有一个列表,其中每个组件都包含以数字开头,后跟单词(字符)的元素。一些以数字开头的元素具有一个或多个前导零。以下是列表的一小部分:

x <- list(el1 = c("0010 First",
                  "0200 Second",
                  "0300 Third",
                  "4000 Fourth",
                  "0 Undefined",
                  "60838 Random",
                  "903200 Haphazard"),
          el2 = c("0100 Hundredth",
                  "0200 Two hundredth",
                  "0300 Three hundredth",
                  "0040 Fortieth",
                  "0 Undefined",
                  "949848 Random",
                  "202626 Haphazard"),
          el3 = c("0010 First",
                  "0200 Second",
                  "0300 Third",
                  "0100 Hundredth",
                  "0200 Two hundredth",
                  "0300 Three hundredth",
                  "0 Undefined",
                  "60838 Random",
                  "20200 Haphazard"))

我想要实现的是,将所有可以去除前导零的元素中的前导零去掉,而在0 Undefined开头保留单个零,并保留所有其他不以前导零开头的元素。也就是说,将列表调整为以下形式:

x <- list(el1 = c("10 First",
                  "200 Second",
                  "300 Third",
                  "4000 Fourth",
                  "0 Undefined",
                  "60838 Random",
                  "903200 Haphazard"),
          el2 = c("100 Hundredth",
                  "200 Two hundredth",
                  "300 Three hundredth",
                  "40 Fortieth",
                  "0 Undefined",
                  "949848 Random",
                  "202626 Haphazard"),
          el3 = c("10 First",
                  "200 Second",
                  "300 Third",
                  "100 Hundredth",
                  "200 Two hundredth",
                  "300 Three hundredth",
                  "0 Undefined",
                  "60838 Random",
                  "20200 Haphazard"))

我已经尝试了几个小时,但仍然没有成功。我所能做到的最好的就是这个:

lapply(x, function(i) {
  ifelse(grep(pattern = "^0+[1-9]", x = i),
         gsub(pattern = "^0+", replacement = "", x = i), i)
})

然而,它只返回那些列表组件中有前导零的元素,但不包括其余没有前导零也没有“0 Undefined”的元素。
有人可以帮忙吗?
1个回答

7
我们循环遍历列表(lapply(x, ..)),使用sub替换列表元素中的前导零。我们匹配字符串开头的一个或多个零(^0+),后跟正则表达式正向先行断言指定的1-9数字((?=[1-9])),并将其替换为''
lapply(x, function(y) sub('^0+(?=[1-9])', '', y, perl=TRUE))

或者,如评论中@hwnd提到的,我们可以使用捕获组,即使用捕获组替代前瞻。
lapply(x, function(y) sub('^0+([1-9])', '\\1', y))

或者不使用匿名函数,我们可以指定subpatternreplacement参数。

lapply(x, sub, pattern='^0+([1-9])', replacement='\\1')

2
您可以省略 perl=TRUE 参数,因为不是必需的。lapply(x, function(y) sub('^0+([1-9])', '\\1', y)) - hwnd
@panman 我正在使用匿名函数,就像你使用了 function(i) 一样。 - akrun
@akrun:哦,我一定是太累了,我问了一个多么愚蠢的问题...当然...抱歉打扰了。 - panman
@panman 你不需要使用匿名调用 lapply(x, sub, pattern='^0+([1-9])', replacement='\\1') - akrun

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接