R中的正则表达式“吃”部分字符串

问题描述:

我想将字符串分成两组。该字符串的结构非常简单,但我无法使其工作。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,结果也是一致的,所以这是我的正则表达式中的一个问题。

什么是在这种情况下使用正确的正则表达式?

“问题”在这里,你有一个正则表达式匹配,不是分裂

您可以使用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"