【发布时间】:2019-07-18 09:48:35
【问题描述】:
我正在执行一项常见任务,即尝试从格式不一致的字符串条目中获取日期,这些字符串中的数字看起来很像日期。大多数日期中存在的一个重要的格式一致性是数字之间的分隔符是一致的。
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
【问题讨论】:
-
我认为更好的方法是列出您接受的格式列表,然后过滤您的原始数据。
-
你认为
(^\\1)(\\3(^\\1)|)是做什么的?插入符号匹配字符串的开头,您希望您的模式如何工作? -
:) 我没想到会工作。我的意思更多是作为我的理论代码可能做的一个例子。
标签: r regex backreference