18

R 中的 strsplit 函数所做的是匹配并删除给定的正则表达式,以将字符串的其余部分拆分为向量。

>strsplit("abc123def", "[0-9]+")
[[1]]
[1] "abc" ""    ""    "def" 

但是我应该如何使用正则表达式以相同的方式拆分字符串,同时保留匹配项?我需要类似下面的东西。

>FUNCTION("abc123def", "[0-9]+")
[[1]]
[1] "abc" "123" "def" 

使用 strapply("abc123def", "[0-9]+|[az]+") 在这里有效,但是如果正则表达式无法捕获除匹配项之外的其余字符串怎么办?

4

3 回答 3

25

从根本上说,在我看来,你想要的不是分裂,而是分裂与其他一切[0-9]+之间的过渡。[0-9]+在您的字符串中,该转换不是预先存在的。gsub要插入它,您可以使用和反向引用进行预处理:

test <- "abc123def"
strsplit( gsub("([0-9]+)","~\\1~",test), "~" )

[[1]]
[1] "abc" "123" "def"
于 2012-06-13T11:51:34.393 回答
9

您可以使用环视断言。

> test <- "abc123def"
> strsplit(test, "(?<=\\D)(?=\\d)|(?<=\\d)(?=\\D)", perl=T)
[[1]]
[1] "abc" "123" "def"
于 2015-03-22T07:00:16.763 回答
2

您可以使用 gsubfn 包中的 strapply。

test <- "abc123def"
strapply(X=test,
         pattern="([^[:digit:]]*)(\\d+)(.+)",
         FUN=c,
         simplify=FALSE)

[[1]]
[1] "abc" "123" "def"
于 2012-06-13T15:03:31.267 回答