正则表达式组Backref不匹配值

时间:2019-07-18 09:48:35

标签: r regex backreference

我正在执行一项常见任务,即尝试从格式不一致的字符串条目中获取日期,该字符串条目的数字也很像日期。大多数日期中存在的重要格式一致性是数字之间的分隔符是一致的。

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 个答案:

答案 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后再加上一些数字,然后再查找日期可能更容易。