处理日期正则表达式捕获R

时间:2017-04-25 21:45:09

标签: r regex dplyr regex-group

我正在尝试将两种格式的日期强制转换为一种格式,我可以轻松地将其添加到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")。如果可能的话,我想在正则表达式中这样做。我知道你可以用另一种方式做,但想要光滑。

有什么想法吗?

1 个答案:

答案 0 :(得分: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" 

subgsubfn

结合使用
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"