regex - 从 R 中的字符串中提取日期

标签 regex r date data.table

我有一个字符串向量,如下所示。我想提取日期。

check_values <- c("deficit based on wage statement 7/14/ to 7/17/2015",
                "Deficit Due: $1205.73 -$879.63= $326.10 x 70%=$228.2",
                "Deficit Due for 12 wks pd - 7/14/15 thru 10/5/15;",
                "Deficit due to wage statement: 4/22/15 thru 5/12/15",
                "depos transcript 7/10/15 for 7/8/15 depos",
                "difference owed for 4/25/15-5/22/15",
                "tpd 4:30:2015 - 5:22:2015",
                "Medical TREATMENT DATES:  6/30/2015 -  6/30/2015",
                "4/25/15-5/22/15",
                "Medical")

                check_values <- as.data.table(check_values)
                names(check_values) <- "check_memo"

在提取日期之前,我想创建一个 Date_Flag。我使用了以下代码,但它给出了不同的输出:

check_values$Date_Flag <- ifelse(grepl("([0-9]+)(/|-|:)([0-9]+)(/|-|:)([0-9]+)(/|-|:)", check_values$check_memo), 1, 0)
 #[1] FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE  TRUE FALSE
 #Expected Output: FALSE FALSE TRUE TRUE TRUE TRUE TRUE TRUE TRUE FALSE

创建此 Date_Flag 后,我想提取日期(两部分)。有人可以告诉我上述常规回归有什么问题吗?

谢谢

最佳答案

我们可以使用 str_count 创建“Date_Flag”,其中假设如果“check_memo”的每个元素中有 2 个完整日期,则结果为 TRUE,否则为 FALSE。

library(data.table)
library(stringr)
pat <- "[0-9]{1,2}[/:][0-9]{1,2}[/:][0-9]{2,4}"
check_values[,Date_Flag := str_count(check_memo, pat)==2]
check_values
#                                             check_memo Date_Flag
#1:   deficit based on wage statement 7/14/ to 7/17/2015     FALSE
#2: Deficit Due: $1205.73 -$879.63= $326.10 x 70%=$228.2     FALSE
#3:    Deficit Due for 12 wks pd - 7/14/15 thru 10/5/15;      TRUE
#4:  Deficit due to wage statement: 4/22/15 thru 5/12/15      TRUE
#5:            depos transcript 7/10/15 for 7/8/15 depos      TRUE
#6:                  difference owed for 4/25/15-5/22/15      TRUE
#7:                            tpd 4:30:2015 - 5:22:2015      TRUE
#8:     Medical TREATMENT DATES:  6/30/2015 -  6/30/2015      TRUE
#9:                                      4/25/15-5/22/15      TRUE
#10:                                             Medical     FALSE

如果我们需要提取日期,请使用与 str_extract_all 相同的模式

check_values[(Date_Flag),  paste0("Date", 1:2) := 
                  transpose(str_extract_all(check_memo, pat))]

check_values
                                              check_memo #Date_Flag     Date1     Date2
# 1:   deficit based on wage statement 7/14/ to 7/17/2015     FALSE        NA        NA
# 2: Deficit Due: $1205.73 -$879.63= $326.10 x 70%=$228.2     FALSE        NA        NA
# 3:    Deficit Due for 12 wks pd - 7/14/15 thru 10/5/15;      TRUE   7/14/15   10/5/15
# 4:  Deficit due to wage statement: 4/22/15 thru 5/12/15      TRUE   4/22/15   5/12/15
# 5:            depos transcript 7/10/15 for 7/8/15 depos      TRUE   7/10/15    7/8/15
# 6:                  difference owed for 4/25/15-5/22/15      TRUE   4/25/15   5/22/15
# 7:                            tpd 4:30:2015 - 5:22:2015      TRUE 4:30:2015 5:22:2015
# 8:     Medical TREATMENT DATES:  6/30/2015 -  6/30/2015      TRUE 6/30/2015 6/30/2015
# 9:                                      4/25/15-5/22/15      TRUE   4/25/15   5/22/15
#10:                                              Medical     FALSE        NA        NA

关于regex - 从 R 中的字符串中提取日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37899298/

相关文章:

regex - 如何将正则表达式转换为不支持反向引用的 golang 正则表达式风格?

ruby - 用于检查最后一个字符的正则表达式

mysql - 如何从 MySQL 数据库的不同表中提取创建语句?

r - R 中变量的单独值的单独表/矩阵

r - as.POSIXct 的时区不起作用

php - CONCAT日期问题

c - 如何检查 ANSI C 中的周数是偶数还是奇数?

java - 在Java中使用正则表达式在字符串中添加分隔符

regex - sed 查找和替换

r - 如何将循环中的函数添加到R中的R6Class