使用R中的RegEx以Mon,DD,YYYY格式解析日期

时间:2015-08-05 15:47:30

标签: regex r date parsing grep

我试图从一串文本中解析一个日期。我假设最好的方法是使用正则表达式,但我还没有找到一个有效的解决方案。

首先,我使用CSS选择器从网站上获取日期。

date <-html_nodes(x=doc, css=".middleheadline+ .topnewsbar b") %>% html_text()

这会产生:

[1] "\r\n        Washington,\r\n        Jan 5, 2011"

我想从此字符串中提取日期本身(此处为2011年1月5日)。注意:月份可以是任何月份,日期可以是任何日期,年份可以是2011-2015之间的任何年份,因此我试图找到一般可以解析Mon D [D]中的日期的表达式],YYYY格式。

这是一次尝试:

date <-str_extract_all(string=date, pattern='[A-Z][a-z]{3,4} ([0-9]{1,2}), [0-9]{4}')

这会产生character(0)

另一个:

grep("[A-Z][a-z]{3,4} ([0-9]{1,2}), [0-9]{4}", date, value=TRUE)

也产生character(0)

任何提示?

5 个答案:

答案 0 :(得分:5)

您也可以尝试CLLocationDistance dist = [loc1 distanceFromLocation:loc2]; 。有时我更喜欢它而不是一个令人头脑麻木的正则表达式。

SELECT TOP(5) 
FROM 
     (SELECT ActivityDate, Score, AccountID FROM Table1 WITH(NOLOCK)
      UNION
      SELECT ActivityDate, Score, AccountID FROM Table2 WITH(NOLOCK)) Test
ORDER BY 
    AccountID, ActivityDate DESC

答案 1 :(得分:2)

你可以试试这个:

date <-str_extract_all(string=date, pattern='\\w+\\s\\d+(st)?(nd)?(rd)?(th)?,\\s+\\d+')

HERE测试链接。

答案 2 :(得分:2)

转换日期的功能:

make_dates <- function(x, date_format=TRUE, split="\n") {
  dates <- lapply(strsplit(x, split), function(x) {
    grep("\\w+ \\d+, \\d+", x, value=T)})

  if(date_format) {
    strptime(gsub("\\s", "", dates), format="%b%d,%Y")
  } else { gsub(".*?(\\w.*)", "\\1", dates)}
}

test <- c("\r\n        Washington,\r\n        Jan 5, 2011",
       "\r\n        Boston,\r\n        Mar 15, 2015")

make_dates(test)
#[1] "2011-01-05 EST" "2015-03-15 EDT"
make_dates(test, FALSE)
#[1] "Jan 5, 2011"  "Mar 15, 2015"

答案 3 :(得分:1)

这是一个正则表达式,它将以各种MDY格式返回字符串中的日期,并带有各种分隔符。请务必在您的程序中设置case insensitve选项。

它会进行一些基本的错误检查,但它会允许两位数的年份;并且还允许约会,例如2015年2月31日

\b((?:jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)[a-z]*|(?:0?[1-9]|1[0-2]))(?:\s*([- /.])\s*)(?:(0?[1-9]|[12]\d|3[01])(?:st|nd|rd|th)?),?\2((?:19|2\d)?\d{2})\b

答案 4 :(得分:0)

我认为这就足够了:

[A-Z][a-z]{2} \d{1,2}, 201[1-4]

演示:https://regex101.com/r/eW3jV6/1

哪个月的缩写是5或4个字符?您的正则表达式失败,因为您有[A-Z][a-z]{3,4}表示大写字母字符后跟三个或四个小写字母字符。我不熟悉一个有5个字符缩写的月份。

您的字符串Jan长度为3个字符,但这些字符中只有2个是小写字母。

您当前正则表达式的演示:https://regex101.com/r/bJ6gT3/1

如果月份和日期和/或年份之间可能存在多个空格,请添加\h+;或者如果没有空格,则将其\h*