我正在做一项常见的任务,试图从格式不一致的字符串条目中获取日期,这些字符串条目的数字看起来也很像日期。大多数日期中存在的一个重要格式一致性是数字之间的分隔符是一致的。
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
发布于 2019-07-18 18:17:14
我不确定在这种情况下是否使用反向引用,但如果格式不总是一致,使用先行可能是有意义的。使用数据+ "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
,然后再查找日期可能会更容易一些。
https://stackoverflow.com/questions/57091703
复制相似问题