R 中的处理日期正则表达式捕获组输出
Process Date Regex Capturing Groups outputs in R
我正在尝试将两种格式的日期强制转换为一种我可以轻松输入 as.Date
的格式。这是一个示例:
library(dplyr)
df <- data_frame(date = c("Mar 29 2017 9:30AM", "5/4/2016"))
我试过这个:
df %>%
mutate(date = gsub("([A-z]{3}) (\d{2}) (\d{4}).*",
paste0(which(month.abb == "\1"),"/\2","/\3"), date))
但它给了我这个:
date
1 /29/2017
2 5/4/2016
但我想要这个!
date
1 3/29/2017
2 5/4/2016
当我使用 month.abb == "\1"
时,它似乎不使用捕获组输出 ("Mar"
),它只使用调用者文本 ("\1"
)。如果可能的话,我想在正则表达式中这样做。我知道你可以用另一种方式做,但想要圆滑。
有什么想法吗?
这是 gsubfn
的一种方式
library(gsubfn)
df$date <- gsubfn("^([A-Za-z]{3})\s+(\d{2})\s+(\d{4}).*", function(x, y, z)
paste(match(x, month.abb),y, z, sep="/"), df$date)
df$date
#[1] "3/29/2017" "5/4/2016"
或sub
结合gsubfn
sub("(\S+)\s+(\S+)\s+(\S+).*", "\1/\2/\3",
gsubfn("^([A-z]{3})", setNames(as.list(1:12), month.abb), df$date))
#[1] "3/29/2017" "5/4/2016"
我正在尝试将两种格式的日期强制转换为一种我可以轻松输入 as.Date
的格式。这是一个示例:
library(dplyr)
df <- data_frame(date = c("Mar 29 2017 9:30AM", "5/4/2016"))
我试过这个:
df %>%
mutate(date = gsub("([A-z]{3}) (\d{2}) (\d{4}).*",
paste0(which(month.abb == "\1"),"/\2","/\3"), date))
但它给了我这个:
date
1 /29/2017
2 5/4/2016
但我想要这个!
date
1 3/29/2017
2 5/4/2016
当我使用 month.abb == "\1"
时,它似乎不使用捕获组输出 ("Mar"
),它只使用调用者文本 ("\1"
)。如果可能的话,我想在正则表达式中这样做。我知道你可以用另一种方式做,但想要圆滑。
有什么想法吗?
这是 gsubfn
library(gsubfn)
df$date <- gsubfn("^([A-Za-z]{3})\s+(\d{2})\s+(\d{4}).*", function(x, y, z)
paste(match(x, month.abb),y, z, sep="/"), df$date)
df$date
#[1] "3/29/2017" "5/4/2016"
或sub
结合gsubfn
sub("(\S+)\s+(\S+)\s+(\S+).*", "\1/\2/\3",
gsubfn("^([A-z]{3})", setNames(as.list(1:12), month.abb), df$date))
#[1] "3/29/2017" "5/4/2016"