r-如何在不编写正则表达式的情况下解析字符串中的日期



readr包有一个名为parse_number的函数,它返回string:中的数字

readr::parse_number("Hello 2022!")
[1] 2022

是否有类似的方法从string返回日期?readr有一个名为parse_date的函数,但它的作用不同:

readr::parse_date("X2018-01-11_poland")
Warning: 1 parsing failure.
row col   expected             actual
1  -- date like  X2018-01-11_poland
[1] NA

期望输出:

# the raw string is "X2018-01-11_poland"
2018-01-11

附言:我对正则表达式不感兴趣。

lubridate包具有易于使用的parse_date_time2

library(lubridate)
dstring <- "X2018-01-11_poland"
date <- parse_date_time2(dstring, orders='Ymd')
date
#[1] "2018-01-11 UTC"

这里有一个没有正则表达式的想法,

parse_date(strsplit(x, '_', fixed = TRUE)[[1]][1], format = 'X%Y-%m-%d')
#[1] "2018-01-11"

然而,如果波兰部分也是固定的,你可以再做一次,

parse_date(x, format = 'X%Y-%m-%d_poland')
#[1] "2018-01-11"

1(这只使用基R,不使用任何正则表达式。它假设(1(日期之前只有字母和空格,就像问题中的情况一样,但如果有必要,可以通过在let中添加额外的字符来轻松放松;(2(日期是标准日期格式。charter将第一个变元中的第i个字符转换为第二个变元的第I个字符,用空格替换每个字母。然后使用as.Date。注意,as.Date会忽略末尾的垃圾邮件,所以如果在日期后面没有其他字符,也可以。

x <- "X2018-01-11_poland"
lets <- paste(letters, collapse = "")
as.Date(chartr(lets, strrep(" ", nchar(lets)), tolower(x)))
## [1] "2018-01-11"

2(如果我们知道字符串总是以X开头,并且Date正好出现在它之后,那么我们可以在as.Date格式字符串中指定前缀。它也不使用任何正则表达式,只使用基R.

as.Date(x, "X%Y-%m-%d")
## [1] "2018-01-11"

3(如果您愿意妥协并使用一个非常简单的正则表达式——这里\D匹配任何非数字,并且反斜杠必须在引号内加倍。gsub删除任何这样的字符。

as.Date(gsub("\D", "", x), "%Y%m%d")
## [1] "2018-01-11"

使用碱基R或stringrlubridate的可能替代品

as.Date(substr("X2018-01-11_poland", 2, 11), format = "%Y-%m-%d")
#> [1] "2018-01-11"
library(stringr)
library(lubridate)
ymd(str_sub("X2018-01-11_poland", 2, 11))
#> [1] "2018-01-11"

创建于2021-12-22由reprex包(v2.0.1(

相关内容

最新更新