【问题标题】:Process Date Regex Capturing Groups outputs in R在 R 中处理日期正则表达式捕获组输出
【发布时间】:2017-09-23 02:34:13
【问题描述】:

我正在尝试将日期从两种格式强制转换为一种格式,我可以轻松地将其输入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")。如果可能的话,我想在正则表达式中执行此操作。我知道你可以用另一种方式做到这一点,但你想变得圆滑。

有什么想法吗?

【问题讨论】:

  • as.Date 可以采用两种格式,即as.Date(df$date, format = c('%b %d %Y %H:%M', '%m/%d/%Y'))(未经测试)
  • 我想用正则表达式来做。不过还是谢谢。
  • 解释:正则表达式看到 paste0 表达式的结果——它永远不会看到粘贴表达式中的值。
  • 啊,有道理。看起来没有办法在一行中将"Mar" 转换为3

标签: r regex dplyr regex-group


【解决方案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" 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-11
    • 1970-01-01
    相关资源
    最近更新 更多