使用R中的正则表达式过滤带有时间戳的日期
我尝试使用正则表达式对向量应用过滤器,以便以以下方式检索与日期和时间戳匹配的数据:“12/20/2018 6:08 PM” 例如:使用R中的正则表达式过滤带有时间戳的日期,r,regex,R,Regex,我尝试使用正则表达式对向量应用过滤器,以便以以下方式检索与日期和时间戳匹配的数据:“12/20/2018 6:08 PM” 例如: 但这与时间戳不匹配。我将OP的正则表达式更改为如下内容: str_detect(vec, "^[1-9]{2}/[1-9]{2}/[1-9]{2} [1-9]{2}:[1-9]{2} [A,P,M]$") library(stringr) str_detect(vec, "^[01][0-9]/[0-3][0-9]/[0-9]{4}\\s1?[0-9]:[0-9]
但这与时间戳不匹配。我将OP的正则表达式更改为如下内容:
str_detect(vec, "^[1-9]{2}/[1-9]{2}/[1-9]{2} [1-9]{2}:[1-9]{2} [A,P,M]$")
library(stringr)
str_detect(vec, "^[01][0-9]/[0-3][0-9]/[0-9]{4}\\s1?[0-9]:[0-9]{2}\\s[AP]M$")
# [1] FALSE FALSE FALSE TRUE TRUE TRUE
或在R基中:
grepl("^[01][0-9]/[0-3][0-9]/[0-9]{4}\\s1?[0-9]:[0-9]{2}\\s[AP]M$", vec)
# [1] FALSE FALSE FALSE TRUE TRUE TRUE
如果您的目标是最终将vec
转换为日期时间,我们可以使用as.POSIXct
直接转换:
datetime_vec <- as.POSIXct(vec, format = "%m/%d/%Y %I:%M %p")
# [1] NA NA NA
# [4] "2018-12-20 18:08:00 EST" "2018-12-21 11:49:00 EST" "2019-01-05 11:21:00 EST"
datetime\u vec您的意思是[0-9]
,而不是[1-9]
。您的正则表达式与零不匹配。此外,最后必须有[AP]M
。还有更多的东西,比如量词。。。请参见^[0-9]{1,2}/[0-9]{1,2}/[0-9]{4}[0-9]{1,2}:[0-9]{2}[AP]M$
()另一个不涉及正则表达式的选项是首先使用lubridate将向量转换为datetime,然后找到它不在哪里NA
:!is.na(lubridate::mdy_hm(vec))
datetime_vec <- as.POSIXct(vec, format = "%m/%d/%Y %I:%M %p")
# [1] NA NA NA
# [4] "2018-12-20 18:08:00 EST" "2018-12-21 11:49:00 EST" "2019-01-05 11:21:00 EST"