我的时间戳以以下形式表示
0992006 09:00
我需要移除前导零以得到以下形式:
992006 9:00
这是我现在正在使用的代码,它不会删除前导零:
prediction$TIMESTAMP <- as.character(format(prediction$TIMESTAMP, '%j%Y %H:%M'))
最简单的方法是创建自己的定界符,该定界符断言字符串的开头或空格之前存在。
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"
是如何定义的。我习惯于它由第一对括号中的内容来定义,但在这里似乎不适用。 - IRTFM(foo|bar)
,它将捕获 foo 或 bar,\\1
返回替换中所捕获的结果。那么这里的工作方式有点类似,(^| )
基本上捕获字符串开头的零宽度空格 ^
或者前导零之前的空格字符,因此在替换中,\\1
将仅返回空格字符到其原始位置,因为 ^
锚定了字符串的开头,实际上没有匹配。您可以在此处查看零宽度位置,http://regex101.com/r/aO6uJ0/1 - hwndgsub("(^0)|(?<=\\s)0", "", "0992006 09:00", perl = TRUE)
## [1] "992006 9:00"
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+
并且在 gsub
的第二部分参数中将那些匹配的 0s
替换为 ""
。
在第二个字符串中,hour
和 minutes
都是 0's
。因此,使用第一个 code
将会得到:
gsub("(?<=^| )0+", "", str2, perl=TRUE)
#[1] "992006 :00"
这里并不清楚OP希望得到什么结果。所以,我认为,与其在:
前移除所有的0
,不如只保留一个0
更好。因此,我将多个0+
的代码替换为一个0
,然后用""
进行替换。
使用 sub
标签:
sub("^[0]+", "", prediction$TIMESTAMP)
[1] "992006 09:00"
您也可以使用 stringr
,而无需使用正则表达式,只需使用子字符串。
> library(stringr)
> str_c(str_sub(word(x, 1:2), 2), collapse = " ")
# [1] "992006 9:00"
> gsub("(?<!:)\\b0+", "", "0992006 09:00", perl=T)
[1] "992006 9:00"
> gsub("(?<![\\d:])0+", "", "0992006 09:00", perl=T)
[1] "992006 9:00"
as.character()
。我熟悉的所有格式化函数都返回 'character' 类型的向量。 - IRTFM