【发布时间】:2017-12-09 03:05:11
【问题描述】:
我想用 R 解析一个字符串,我想得到一个对象列表。字符串中的括号、空格和逗号决定了最终列表的结构:
每对括号之间用空格隔开,每对括号中的单词必须组成一个新的列表对象;
括号中的单词以逗号分隔,并应在每个列出的对象中形成不同的元素;
上述结构也可以嵌套在一对括号内。
这里是字符串的一个例子:
x <- "(K01596,K01610) (K01689) (K01834,K15633,K15634,K15635) (K00927) (K00134,K00150) (K01803) ((K01623,K01624,K11645) (K03841,K02446,K11532,K01086,K04041),K01622)"
所需的输出应该是这样的:
list(c("K01596","K01610"), "K01689", c("K01834","K15633","K15634","K15635"), "K00927", c("K00134","K00150"), "K01803", list(list(c("K01623","K01624","K11645"), c("K03841","K02446","K11532","K01086","K04041")), "K01622"))
我设法解决了如何对案例 1) 进行解析
match <- gregexpr("\\((?>[^()]|(?R))*\\)", x, perl = T)
x2 <- as.list(substring(x, match[[1]], match[[1]] + attr(match[[1]], "match.length") - 1))
和案例 2) 也很简单,我可以用 gsub 删除括号并使用 strsplit 拆分单词。 问题是如何解析案例 3),当我有一个嵌套级别时:
((K01623,K01624,K11645) (K03841,K02446,K11532,K01086,K04041),K01622)
我必须取出一个列表对象,它本身就是一个列表:
list(list(c("K01623","K01624","K11645"), c("K03841","K02446","K11532","K01086","K04041")), "K01622")
【问题讨论】:
-
1.,2.,3.可以更清楚地重述为 “1. 括号包围列表 2. 逗号分隔单个项目 3. 列表可以嵌套”
-
您也没有提到单个列表项的格式,但它看起来像 " 字母后跟几个 (5?) 数字,例如 K01596"