除了括号内的内容外,按空格分割字符串

时间:2016-09-27 20:22:11

标签: r regex strsplit

我有以下字符串:

x <- "(((K05708+K05709+K05710+K00529) K05711),K05712) K05713 K05714 K02554"
# [1] "(((K05708+K05709+K05710+K00529) K05711),K05712) K05713 K05714 K02554"

我希望通过空格分隔符将其拆分,避免括号内的内容,以便有类似的内容:

[[1]]
[1] "(((K05708+K05709+K05710 K00529) K05711),K05712)"                
[2] "K05713"                          "K05714"                         
[4] "K02554"

看到第一个括号级别内有两个空格。

我阅读了以下答案,但在我的案例中我无法使其成功: r split on delimiter not in parenthesesUsing strsplit() in R, ignoring anything in parentheses

提前致谢!

1 个答案:

答案 0 :(得分:3)

我认为你需要一个匹配平衡括号的正则表达式然后跳过它们,然后匹配剩下的空格与以下基于PCRE的正则表达式:

(\((?:[^()]++|(?1))*\))(*SKIP)(*F)|\s

请参阅regex demo(用上面的\s替换空格以获得更好的可见性。)

模式详情

  • (\((?:[^()]++|(?1))*\))(*SKIP)(*F) - 第1组匹配
    • \((?:[^()]++|(?1))*\) - 呈现平衡括号子字符串的子字符串:\(匹配((?:[^()]++|(?1))*匹配零个或多个(*)1+序列()以外的字符(请参阅[^()]++)或整个第1组的整个模式(请参阅子路由调用(?1)),然后\)匹配文字)(*SKIP)(*F)使正则表达式丢弃整个匹配的文本,同时保持正则表达式索引在该匹配结束时,继续寻找下一个匹配
  • | - 或
  • - 要分割的空间

这是online R demo

s <- "(((K05708+K05709+K05710+K00529) K05711),K05712) K05713 K05714 K02554"
strsplit(s, "(\\((?:[^()]++|(?1))*\\))(*SKIP)(*F)| ", perl=TRUE)

输出:

[[1]]
[1] "(((K05708+K05709+K05710+K00529) K05711),K05712)"
[2] "K05713"                                         
[3] "K05714"                                         
[4] "K02554"