R - 如何使用 grep 提取日期?我需要为每个匹配" , "、" / "、" . "、" - "

  • 本文关键字:grep 何使用 提取 取日期 r regex
  • 更新时间 :
  • 英文 :


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

最新更新