2016-01-21 31 views
2

我想將字符串分成兩組。該字符串的結構非常簡單,但我無法使其工作。R中的正則表達式「吃」部分字符串

txt <- "text12-01-2016" 

它總是一些字母,後跟一個日期和日期,顯然是以數字開頭。我試過以下的正則表達式在https://regex101.com/和有效地得到妥善分隔字符串:

([a-zA-Z]*)([0-9].*) 
1. "text" 
2. "12-01-2016" 

但是當我嘗試R中失敗:

strsplit(a[1],split = "([a-zA-Z]*)([0-9]*)") 
[[1]] 
[1] "" " " "" "." " " "" " " "" "-" "" "-" "" 

如果我介紹雙方括號,然後將其「吃」出了第一組的最後一個字符,並在第一第二的:

strsplit(txt,split = "([[a-zA-Z]]*)([[0-9]]*)") 
[[1]] 
[1] "tex"  "2-01-2016" 

如果我使用perl=TRUE沒關係。如果我使用stringi::stri_split,結果也是一致的,所以這是我的正則表達式中的一個問題。

什麼是在這種情況下使用正確的正則表達式?

回答

5

「問題」在這裏,你有一個正則表達式匹配,不是分裂

您可以使用following PCRE regexstrsplit

strsplit(txt,split = "(?<=[a-zA-Z])(?=[0-9])", perl=T) 
[[1]] 
[1] "text"  "12-01-2016" 

正則表達式匹配一個字母和一個數字之間的位置和strsplit將分裂的結果。如果需要,您可以進一步將其列入清單。

如果您想使用您正則表達式,使用str_matchstringr

> library(stringr) 
>str_match(txt, "([a-zA-Z]*)([0-9].*)") 
    [,1]    [,2] [,3]   
[1,] "text12-01-2016" "text" "12-01-2016" 
相關問題