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 regex与strsplit
:
strsplit(txt,split = "(?<=[a-zA-Z])(?=[0-9])", perl=T)
[[1]]
[1] "text" "12-01-2016"
正则表达式匹配一个字母和一个数字之间的位置和strsplit将分裂的结果。如果需要,您可以进一步将其列入清单。
如果您想使用您正则表达式,使用str_match
从stringr
:
> library(stringr)
>str_match(txt, "([a-zA-Z]*)([0-9].*)")
[,1] [,2] [,3]
[1,] "text12-01-2016" "text" "12-01-2016"