我有一个如下所示的字符串:
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"
但我找不到将两者结合在一起的方法。 然后,我希望拆分不包含括号的元素。
如果有人可以帮我解决这个问题,或者知道更优雅的方法,我真的很感激。
非常感谢!
答案 0 :(得分:4)
答案 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)