Regex 更正格式错误的日期
我在格式良好的日期之间有一些不正确的日期,如下所示:Regex 更正格式错误的日期,regex,r,date,Regex,R,Date,我在格式良好的日期之间有一些不正确的日期,如下所示: df <- data.frame(col=c("--1.1.11-01","--1.11.12-1","--1.1.13-01","--1.1.14-01","--1.10.10-01","-1.10.11-01","---1.10.12-01","2010-03-31","2010-04-01","2010-04-05")) 我要绞尽脑汁的是-01部分,因为删除这些,也会删除部分正确格式的日期 编辑:格式为mm.dd.yy我注意到,
df <- data.frame(col=c("--1.1.11-01","--1.11.12-1","--1.1.13-01","--1.1.14-01","--1.10.10-01","-1.10.11-01","---1.10.12-01","2010-03-31","2010-04-01","2010-04-05"))
我要绞尽脑汁的是-01
部分,因为删除这些,也会删除部分正确格式的日期
编辑:格式为
mm.dd.yy
我注意到,如果日期前缀的条目为-1或--1,则只存在非法后缀,即-01。
您可以首先获取数组中的所有值。
因此,您将有一个数组--1.1.11-01“,”--1.11.12-1“,”--1.1.13-01“,”--1.1.14-01“,”--1.10.10-01“,“-1.10.11-01”
现在可以检查前缀是-1还是--1。如果存在任何这样的东西,那么您可以将其标记为删除后缀-01。
根据上面的输入模式,我觉得上面的策略会起作用
请告诉我该策略是否有效一个简单的regexp可以很好地解决这类问题:
> df <- c("--1.1.11-01","--1.11.12-1","--1.1.13-01","--1.1.14-01","--1.10.10-01","-1.10.11-01","---1.10.12-01","2010-03-31","2010-04-01","2010-04-05")
> df
[1] "--1.1.11-01" "--1.11.12-1" "--1.1.13-01" "--1.1.14-01" "--1.10.10-01" "-1.10.11-01" "---1.10.12-01"
[8] "2010-03-31" "2010-04-01" "2010-04-05"
> df <- sub(".*([0-9]{4}\\-[0-9]{2}\\-[0-9]{2}|[0-9]{1,2}\\.[0-9]{1,2}\\.[0-9]{1,2}).*", "\\1", df)
> df
[1] "1.1.11" "1.11.12" "1.1.13" "1.1.14" "1.10.10" "1.10.11" "1.10.12" "2010-03-31" "2010-04-01"
[10] "2010-04-05"
>测向
[1] "--1.1.11-01" "--1.11.12-1" "--1.1.13-01" "--1.1.14-01" "--1.10.10-01" "-1.10.11-01" "---1.10.12-01"
[8] "2010-03-31" "2010-04-01" "2010-04-05"
>df-df
[1] "1.1.11" "1.11.12" "1.1.13" "1.1.14" "1.10.10" "1.10.11" "1.10.12" "2010-03-31" "2010-04-01"
[10] "2010-04-05"
请注意,我将其设置为字符向量,而不是data.frame
解决方案本身只是匹配一个模式或另一个模式,然后用子模式替换掉其余的模式。只需删除开头的所有非单词字符或结尾的
-01
或-1
,前面没有-
+两位数字
> x <- c("--1.1.11-01","--1.11.12-1","--1.1.13-01","--1.1.14-01","--1.10.10-01","-1.10.11-01","---1.10.12-01","2010-03-31","2010-04-01","2010-04-05")
> gsub("^\\W+|(?<!-\\d{2})-0?1$", "", x, perl=T)
[1] "1.1.11" "1.11.12" "1.1.13" "1.1.14" "1.10.10"
[6] "1.10.11" "1.10.12" "2010-03-31" "2010-04-01" "2010-04-05"
>xgsub(“^\\W+|)(?这里是一个使用sub
的非常简单的解决方案
sub('^-+([^-]+).+', '\\1', df$col)
# [1] "1.1.11" "1.11.12" "1.1.13" "1.1.14" "1.10.10"
# [6] "1.10.11" "1.10.12" "2010-03-31" "2010-04-01" "2010-04-05"
您能告诉我们正确日期的格式吗?我是说dd.mm.yy或mm.dd.yy?很好用。我接受@LauriK solution,理由是首先正确回答问题。谢谢。谢谢,我真的很喜欢您的解决方案,它很简单,我理解:)
sub('^-+([^-]+).+', '\\1', df$col)
# [1] "1.1.11" "1.11.12" "1.1.13" "1.1.14" "1.10.10"
# [6] "1.10.11" "1.10.12" "2010-03-31" "2010-04-01" "2010-04-05"