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"