首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Regex组Backref不匹配的值

Regex组Backref不匹配的值
EN

Stack Overflow用户
提问于 2019-07-18 17:48:36
回答 1查看 53关注 0票数 1

我正在做一项常见的任务,试图从格式不一致的字符串条目中获取日期,这些字符串条目的数字看起来也很像日期。大多数日期中存在的一个重要格式一致性是数字之间的分隔符是一致的。

代码语言:javascript
运行
复制
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(...|)`就可以做到这一点。

下面是我使用^作为匹配零化器的尝试。

代码语言:javascript
运行
复制
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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-07-18 18:17:14

我不确定在这种情况下是否使用反向引用,但如果格式不总是一致,使用先行可能是有意义的。使用数据+ "01.22.19 PSI""01.24 2018 19 PSI"作为额外的测试用例:

代码语言:javascript
运行
复制
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位数字,如果后跟行尾或空格加另一个数字。否则,最后的分隔符必须是连字符或句点:

代码语言:javascript
运行
复制
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,然后再查找日期可能会更容易一些。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57091703

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档