我正在执行一项常见任务,即尝试从格式不一致的字符串条目中获取日期,该字符串条目的数字也很像日期。大多数日期中存在的重要格式一致性是数字之间的分隔符是一致的。
library(stringr)
library(dplyr)
dat1 = c("01-25-2019", "15 01 2018", "01.16.2018", "01.24 2018", "01.22 19 PSI", "10.19 PSI", "01.01.01")
dat1 %>% str_extract("[0-9]{1,4}([- /\\.])[0-9]{1,4}(\\1[0-9]{1,4}|)")
# [1] "01-25-2019" "15 01 2018" "01.16.2018" "01.24" "01.22" "10.19" "01.01.01"
向后引用似乎可以有效地与分隔符保持一致。我还想做的是对不匹配项进行反向引用,这样,如果在一个位置201[5-9]" it cannot be matched in another location. Likewise with month or day. At times I would also need to allow the year to be implied by context. That is what the last group
(... |)`匹配了一年,就可以了。
以下是我尝试使用^
作为匹配项的内容。
dat1 %>% str_extract("([0-3][0-9]|[0-3][0-9]|(201[5-9]|1[5-9]))([ /\\.])(^\\1)(\\3(^\\1)|)")
# [1] NA NA NA NA NA NA NA
答案 0 :(得分:0)
在这种情况下,我不确定要使用反向引用,但是如果格式不总是一致的话,则使用超前查找可能很有意义。使用数据+ "01.22.19 PSI"
和"01.24 2018 19 PSI"
作为额外的测试用例:
dat1 = c("01-25-2019", "15 01 2018", "01.16.2018", "01.24 2018", "01.24 2018 19 PSI", "01.22 19 PSI", "10.19 PSI", "01.01.01", "01.22.19 PSI")
重要的是最后一组,它查找由空格,连字符或句点分隔的2-4位数字,如果后面是行末或空格加另一位数字。否则,最后的分隔符必须为连字符或句号:
str_extract(dat1, "\\d{2}[-\\. ]\\d{2}([-\\. ]\\d{2,4}(?= \\d|$)|[-\\.]\\d{2,4})?")
#### OUTPUT ####
[1] "01-25-2019" "15 01 2018" "01.16.2018" "01.24 2018" "01.24 2018" "01.22" "10.19" "01.01.01" "01.22.19"
显而易见的好处是它也可以使用格式不一致的格式,例如"01.24 2018"
和"01.24 2018 19 PSI"
。它可能仍需要进行一些微调,但我认为在此原理的基础上应该相当简单。
我经常使用的另一种更简单的方法是首先消除明显的不匹配。例如,先删除PSI
后再加上一些数字,然后再查找日期可能更容易。