2017-03-16 54 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