从时间戳%j%Y%H:%M中删除前导零

时间:2014-09-12 06:20:45

标签: regex r date

我的时间戳格式为

0992006 09:00

我需要删除前导零以获取此表单:

992006 9:00

这是我现在使用的代码,它不会删除前导零:

prediction$TIMESTAMP <- as.character(format(prediction$TIMESTAMP, '%j%Y %H:%M'))

6 个答案:

答案 0 :(得分:8)

最简单的方法是创建自己的边界,断言字符串的开头或空格先行。

gsub('(^| )0+', '\\1', '0992006 09:00')
# [1] "992006 9:00"

您可以使用诀窍进行替换豁免。 \K重置报告的匹配的起点,不再包括任何以前消费的字符。

gsub('(^| )\\K0+', '', '0992006 09:00', perl=T)
# [1] "992006 9:00"

或者您可以使用sub并匹配,直到第二组前导零。

sub('^0+([0-9]+ )0+', '\\1', '0992006 09:00')
# [1] "992006 9:00"

为了涵盖所有可能性,如果你知道你将拥有像0992006 00:00这样的格式,只需在正则表达式中从零中删除+量词,这样它只会删除第一个前导零。

答案 1 :(得分:7)

这是使用lookbehind

的另一种选择
gsub("(^0)|(?<=\\s)0", "", "0992006 09:00", perl = TRUE)
## [1] "992006 9:00"

答案 2 :(得分:7)

str1 <- "0992006 09:00"
gsub("(?<=^| )0+", "", str1, perl=TRUE)
#[1] "992006 9:00"

对于以下情况,可能是:

str2 <- "0992006 00:00"
 gsub("(?<=^| )0", "", str2, perl=TRUE)
 #[1] "992006 0:00"

解释

此处的想法是使用look behind (?<=^| )0+来匹配0 s

如果它出现在字符串的开头 (?<=^

|

如果它位于空格)0+

之后

并在0s参数的第二部分中将匹配的""替换为gsub

在第二个字符串中,hourminutes都是0's。因此,使用第一个code会导致:

 gsub("(?<=^| )0+", "", str2, perl=TRUE)
 #[1] "992006 :00"

目前尚不清楚OP会接受什么。所以,我想,不是在0之前删除整个:,而是留下一个0会更好。因此,我将多个0+代码替换为一个0,并将其替换为""

答案 3 :(得分:2)

使用sub

  sub("^[0]+", "", prediction$TIMESTAMP) 
[1] "992006 09:00"

答案 4 :(得分:1)

通过使用子字符串,您也可以在没有正则表达式的情况下使用stringr

> library(stringr)
> str_c(str_sub(word(x, 1:2), 2), collapse = " ")
# [1] "992006 9:00"

答案 5 :(得分:1)

更多Perl正则表达式,

> gsub("(?<!:)\\b0+", "", "0992006 09:00", perl=T)
[1] "992006 9:00"
> gsub("(?<![\\d:])0+", "", "0992006 09:00", perl=T)
[1] "992006 9:00"