2017-03-16 29 views
1

我有我想在不同的格式(如CHR)一个问题,我认为是通过使用正则表达式解决了R.正则表达式的个位数

我有一组日期(如CHR)的。

我试图欺骗下面的例子,其中第一个(new_dates)给出正确的格式数月1-9和错误的10-12和(new_dates2)给出正确的格式为10-12,但没有为1-9。

我看到的是,在第一种情况下的代码一个数字匹配两次,10-12,但真的不知道该怎么告诉它仅匹配单个数字。

正确日期的最终载体显示了结果,我想。

dates <- c("1/2016", "2/2016", "3/2016", "4/2016", "5/2016", "6/2016", "7/2016", "8/2016", "9/2016", "10/2016", "11/2016", "12/2016", "1/2017") 
new_dates <- sub("(\\d)[:/:](\\d{4})","\\2M0\\1", dates) 
new_dates2 <- sub("(\\d{2})[:/:](\\d{4})","\\2M\\1", dates) 
correctdates <- c("2016M01", "2016M02", "2016M03", "2016M04", "2016M05", "2016M06", "2016M07", "2016M08", "2016M09", "2016M10", "2016M11", "2016M12", "2017M1") 
+0

我本人正则表达式的支持者,但一般会建议对他们的日期和时间的情况下使用。专用软件包中有更强大的功能,例如用于这些任务的'lubridate'。 –

+1

这里的一个基R法,将返回所需的格式:'格式(as.Date(paste0( “1 /”,日期), “%d /%米/%Y”), “%YM%M”)' 。 – lmo

+0

随着正则表达式,就可以做到这一点,但与'gsubfn':'gsubfn( “(\\ d {1,2})/(\\ d {4})”,函数(X,Y)paste0(Y, “M”,ifelse(NCHAR(X)== 2 “”, “M”),X),日期) ' –

回答

1

这里的一个基R法,将返回所需的格式:

format(as.Date(paste0("1/",dates), "%d/%m/%Y"), "%YM%m") 
[1] "2016M01" "2016M02" "2016M03" "2016M04" "2016M05" "2016M06" "2016M07" "2016M08" "2016M09" 
[10] "2016M10" "2016M11" "2016M12" "2017M01" 

的想法是第一转换日期对象,然后使用format函数来创建所需的字符表示。我贴上了1/,以便每个元素都有一天。

0

由于@a P 2 O 5米说,这可能是更好的去寻找另一种解决办法,如果你正在处理日期,但如果你想坚持使用正则表达式,你可以试试这个。

([02-9]|1[0-2]?)[:\/](\d{4})example

+0

我刚试过,有两个问题。首先它的一部分在R表示法中不可用。我自己修正了这些(我认为),但是它在1-9之前缺少零。这当然可能与R问题有关。 – MortenAnthonsen

0
new_dates <- sub("(\\d{1,2})\\/(\\d{4})","\\2M0\\1", dates) 

It's fine. 
+1

那个在10-12之前给出零,如:2016M012。 – MortenAnthonsen

+0

对不起,我弄错了数据。这段代码会很好'new_dates < - sub(“(\\ d {2})\\ /(\\ d {4})”,“\\ 2M \\ 1”,sub(“(^ \\ d {1})/”, “0 \\ 1 /”,日期))' – Liun