target: "2019,3,1", "2019.03.01";2019-03-01"21/3/1"
year<-c("2019,3,1", "2019,03,01", "2019.03.01", "2019-03-01", " '21/3/1", "2019,3-1", "2019-03=01", "2019,03.01", "2019/03-01", "2019-350-01")
grep("",year,value=T)
我试着
grep("[20 ']19([,./-]0?[3])[,./-](0?[1])$",year,value=T)
但我仍然有"2019,3-1"2019年,03.01";"2019/03-01">
你可以试试:
year<-c("2019,3,1", "2019,03,01", "2019.03.01", "2019-03-01", " '21/3/1", "2019,3-1", "2019-03=01", "2019,03.01", "2019/03-01", "2019-350-01")
grep("\d{2,4}([,./-])\d{1,2}\1{1}\d{1,2}",year,value=T)
详细:
\d{2,4}
:数字的长度范围分别为2到4 year([,./-])
:组字符(默认组1)。\d{1,2}
:一个数字的长度范围分别为1或2月\1{1}
:与第1组捕获的值相同,长度为1\d{1,2}
:数字的长度范围分别为1或2天
输入图片描述
我通常使用regex101可视化,但它没有R。有一个小的修改,从python regex转换为R regex。例如,在python中使用d,在R中使用\d。
希望对大家有用。
除非您确实需要正则表达式解决方案,否则您可以使用lubridate
包中的ymd()
函数。
library(lubridate)
ymd(year)
其输出:
[1] "2019-03-01" "2019-03-01" "2019-03-01" "2019-03-01" "2021-03-01"
[6] "2019-03-01" "2019-03-01" "2019-03-01" "2019-03-01" NA
Warning message:
1 failed to parse.
解析失败的是"2019-350-01"
,显然不能直接解释为日期。
正如其他人所指出的,这取决于您对日期的严格程度,但是如果您希望将数字之间的任何符号视为年/月/日之间的界限,请使用regex
as.Date(gsub("[^0-9]", "/", year),format = "%Y/%m/%d"))
它将除数字以外的任何内容转换为/,因此,给出以'和月份为350开头的NA