保留两个分隔符之前(和之后)的R strsplit

时间:2014-08-06 12:17:34

标签: regex r delimiter strsplit

我有一个如下所示的字符串:

x <- "01(01)121210(01)0001"

我想将其拆分为一个向量,以便我得到以下内容:

[1] "0" "1" "(01)" "1" "2" "1" "2" "1" "0" "(01)" "0" "0" "0" "1"

(|)可以是[|]或{|},括号之间的位数可以是2或更多。

我一直试图通过先在括号上分开来做到这一点:

unlist(strsplit(x, "(?<=[\\]\\)\\}])", perl=T))
[1] "01(01)" "121210(01)" "0001"

or unlist(strsplit(x, "(?<=[\\[\\(\\{])", perl=T))
[1] "01(" "01)121210(" "01)0001"

但我找不到将两者结合在一起的方法。 然后,我希望拆分不包含括号的元素。

如果有人可以帮我解决这个问题,或者知道更优雅的方法,我真的很感激。

非常感谢!

4 个答案:

答案 0 :(得分:4)

只需将PERL选项更改为TRUE,并根据以下模式拆分输入字符串。

(?<!\(|^)(?!\)|\d\)|$)

DEMO

R正则表达式,

"(?<!\\(|^)(?!\\)|\\d\\)|$)"

答案 1 :(得分:3)

这是另一种方式:

unlist(strsplit(x, '\\([^)]*\\)(*SKIP)(*F)|(?=)', perl=T))
# [1] "0"    "1"    "(01)" "1"    "2"    "1"    "2"    "1"    "0"    "(01)" "0"    "0"    "0"    "1" 

\\([^)]*\\)匹配括号中的任何内容,(*SKIP)(*F)告诉正则表达式引擎在此模式上失败,如果它在字符串中找到该模式,则不要使用该字符串重新测试该部分字符串|另一边的替代模式。 |另一侧的模式为(?=),这与字符之间的空格匹配。

答案 2 :(得分:1)

这可以在gsubfn包中使用strapply在没有零宽度前瞻/后方表达式的情况下完成。正则表达式匹配数字或a(直到下一个)。

library(gsubfn)

strapply(x, "\\d|\\(.*?\\)", c, perl = TRUE)[[1]]

,并提供:

 [1] "0"    "1"    "(01)" "1"    "2"    "1"    "2"    "1"    "0"    "(01)"
[11] "0"    "0"    "0"    "1"  

注意:在问题中显示的示例中,(...)中的部分始终是两位数。如果情况总是这样,可以进一步简化为:

strapplyc(x, "\\d|\\(...")[[1]]

更新添加了备注。

答案 3 :(得分:1)

另一种可能的方式:

unlist(strsplit(x, '(?!\\(?\\d*\\))', perl=T))

比Matthew Plourde方式更短但效率更低

或像G.格洛腾迪克那样的方式:

m<-gregexpr("\\d|\\([^)]*\\)", x)
regmatches(x, m)