Re: [問題] 使用正則來分割字串

作者: celestialgod (天)   2016-01-09 15:49:09
※ 引述《corel (可羅)》之銘言:
: 程式諮詢(我想用R 做某件事情,但是我不知道要怎麼用R 寫出來)
: 大家好,小弟是R新手
: 假設我有二個字串的格式如下
: [1] "03Jan-05Jan201602Jul-04Jul2016"
: [2] "06Jan-09Jan2016January 2017"
: 我想要把它分離成
: "03Jan-05Jan2016"
: "02Jul-04Jul2016"
: 與
: "06Jan-09Jan2016"
: "January 2017"
: [1][2]只是舉例,其實想要處理字串的長度不一
: 小弟有想到用正則表示式來處理, 以下是我的寫法
: # 針對06Jan-09Jan2016格式設計的正則表示式方法
: s <- "03Jan-05Jan201602Jul-04Jul2016"
: x <- gsub("(((0[1-9]|[12][0-9]|3[01]{2})[a-zA-Z]{3})-
: ((0[1-9]|[12][0-9]|3[01]{2})[a-zA-Z]{3})[0-9]{4})",";",s)
: x
: # 只不過斷出來的字串是
: # OUT PUT ";;"
: 其實我想要斷出來的字串是
: Result 1:
: "03Jan-05Jan2016;02Jul-04Jul2016"
: 或
: Result 2:
: "03Jan-05Jan2016"
: "02Jul-04Jul2016"
: 在此,想請問大家, 在R之中是否有其它函數配合 正則表示式用來斷出
: Result 1或是 Result 2的結果?
: 謝謝大家
x = c("03Jan-05Jan201602Jul-04Jul2016", "06Jan-09Jan2016January 2017")
pattern1 = "(\\d{2}[a-zA-Z]{3}-\\d{2}[a-zA-Z]{3}\\d{4})"
pattern2 = "([a-zA-Z]*\\s\\d{4})"
regexpRes = regexec(paste0(pattern1, pattern1, '?', pattern2, '?'), x)
lapply(regmatches(x, regexpRes), function(x){
x[nchar(x) > 0 & c(FALSE, rep(TRUE, length(x)-1))]
})
#
# [[1]]
# [1] "03Jan-05Jan2016" "02Jul-04Jul2016"
#
# [[2]]
# [1] "06Jan-09Jan2016" "January 2017"
後面新問題:
字串它可能會有
[1]"03Jan-05Jan201602Jul-04Jul201602Dec-04Dec2016" #三筆同格式
[2]"06Jan-09Jan2016January 2017" #二筆不同格式
[3]"May 201607Jan-08Jan2016" #二筆不同格式
[4]"07Jan-10Jan2016MAY 201706Jan-09Jan2018" #二筆不同格式
等多種組合...
要如何改寫讓程式可以自動判斷
http://pastebin.com/GRWaVSz1
作者: corel (可羅)   2016-01-10 19:35:00
感謝,請問有R的書推薦嗎?謝謝推薦

Links booklink

Contact Us: admin [ a t ] ucptt.com