我试图从一串文本中解析一个日期。我假设最好的方法是使用正则表达式,但我还没有找到一个有效的解决方案。
首先,我使用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)
任何提示?
答案 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*
。