R 问题从非结构化文本中的各种格式提取日期部分

R 问题从非结构化文本中的各种格式提取日期部分,r,regex,datetime,pattern-matching,R,Regex,Datetime,Pattern Matching,我试图从一堆非结构化文本中只提取日期部分 问题是,日期可以采用以下任何格式: 2017年1月16日或1月16日(2017年1月16日) 2017年1月2日 2017年1月2日(日/月/年) 2017年2月1日(年月日) 01-02-17(年月日) 示例文本: x <- "There is a date which is Jan 2, 2017. Here is another date example 02/01/2017. This is third example date typ

我试图从一堆非结构化文本中只提取日期部分

问题是,日期可以采用以下任何格式:

  • 2017年1月16日或1月16日(2017年1月16日)
  • 2017年1月2日
  • 2017年1月2日(日/月/年)
  • 2017年2月1日(年月日)
  • 01-02-17(年月日)
示例文本:

x <- "There is a date which is Jan 2, 2017. Here is another date example 02/01/2017. This is third example date type [01/02/17]. This is fourth example date Jan. 16 and finally one more example is 01-02-2017"

是否还有其他普遍的可能性?

首先,在不知道日期格式的情况下,对于2002年3月2日的示例,您无法判断一天是否为一天,一个月是否为一个月。。。。万一年份也可以是两位数。。。例如年月日或年月日或年月日。。。你不能说哪一个是天,哪一个是月,哪一个是年

考虑到所有这些因素。。。可能有来自第三方的字符串,您可能无法确定其格式。。。因此,任何解决方案都不能保证为您定义日期、月份或年份

但是,您可以识别您提到的所有数字模式。以下解决方案将为您提供三组。您将获得您在组1、2和3中提到的所有格式的日期的三部分。你必须分析/猜测一种方法来计算哪一个是天,哪一个是月,哪一个是年。这不在正则表达式的范围内

考虑到所有这些事实,您可以尝试以下正则表达式:

((?:(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)[a-z ]*\.?)|(?:\d{1,2}))[\/ ,-](\d{1,2})(?:[\/ ,-]\s*(\d{4}|\d{2}))?

示例源():


“Januray”是一个输入错误还是一个您需要说明的实际情况?可能是一个开始。我不知道为什么在示例文本不包含任何括号的情况下尝试匹配括号。其次,用方括号转义特殊字符通常是不好的做法,因为这也是创建字符集的方式,而某些特殊字符不会以这种方式转义或具有不同的含义(例如,
^
)。只需使用“\”。@KenS。谢谢你指出。是的,这是一个Typro。@CAustin-实际上这只是一个大文档中的示例文本,还有括号。Rizwan,谢谢。但这又有什么关系呢?例如,2002年2月2日可以写成2002年2月2日(dd/mm/yyyy或mm/dd/yyyy)或2002年2月2日(dd/mm/yy或yy/dd/mm或mm/yy/dd),对吗?逻辑应该能够匹配它,并将其引入适当的通用最终格式。对吗?2002年3月2日怎么样?那么是3月2日还是2月3日?关键是。。。。通过上面的正则表达式,你肯定会得到3个部分。。。这肯定取决于你。。。决定你想用什么逻辑来决定哪一天,哪一个月,哪一年我同意。但应该有出路吗-(让我们忘记所有的正则表达式或所有东西。简单想想,我告诉你02/03/01,但不告诉你日期格式…你从中得到了什么?有一个办法,发送数据的一方可能知道格式…他们必须共享它。。。
((?:(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)[a-z ]*\.?)|(?:\d{1,2}))[\/ ,-](\d{1,2})(?:[\/ ,-]\s*(\d{4}|\d{2}))?
library(stringr)
str<-"Jan. 16  bla bla bla Jan 16 2017 bla bla bla January 2, 2017 bla bla bla 02/01/2017 bla bla bla 01/02/2017 bla bla bla 01-02-17 bla bla bla jan. 16 There is a date which is Jan 2, 2017. Here is another date example 02/01/2017. This is third example date type [01/02/17]. This is fourth example date Jan. 16 and finally one more example is 01-02-2017"
patt <- "(?i)((?:(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)[a-z ]*\\.?)|(?:\\d{1,2}))[\\/ ,-](\\d{1,2})(?:[\\/ ,-]\\s*(\\d{4}|\\d{2}))?"
result<-str_match_all(str,patt)
result
      [,1]              [,2]      [,3] [,4]  
 [1,] "Jan. 16"         "Jan."    "16" ""    
 [2,] "Jan 16 2017"     "Jan"     "16" "2017"
 [3,] "January 2, 2017" "January" "2"  "2017"
 [4,] "02/01/2017"      "02"      "01" "2017"
 [5,] "01/02/2017"      "01"      "02" "2017"
 [6,] "01-02-17"        "01"      "02" "17"  
 [7,] "jan. 16"         "jan."    "16" ""    
 [8,] "Jan 2, 2017"     "Jan"     "2"  "2017"
 [9,] "02/01/2017"      "02"      "01" "2017"
[10,] "01/02/17"        "01"      "02" "17"  
[11,] "Jan. 16"         "Jan."    "16" ""    
[12,] "01-02-2017"      "01"      "02" "2017"