R:从字符串的开头删除前导零

时间:2015-09-27 20:09:53

标签: regex r list character leading-zero

我首先提到this question,但答案对我的情况没有帮助。

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

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 个答案:

答案 0 :(得分:7)

我们遍历listlapply(x, ..)),使用sub替换list元素中的前导零。我们匹配字符串开头(^0+)中的一个或多个零,后跟正面正则表达式前瞻((?=[1-9]))指定的数字1-9,并将其替换为{{1} }。

''

或者如评论中提到的@hwnd,我们可以使用捕获组,而不是lapply(x, function(y) sub('^0+(?=[1-9])', '', y, perl=TRUE))

lookahead

或者,如果不使用匿名函数,我们可以指定lapply(x, function(y) sub('^0+([1-9])', '\\1', y)) 的{​​{1}}和pattern参数

replacement