2016-09-27 201 views
3

我有以下字符串:分割字符串括号

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

感谢:

我阅读下面的答案,但我不能让它在我的情况下工作!

+0

看起来像你的字符串嵌套了平衡'()',你需要跳过里面*平衡*括号中的空间,对不对? –

+0

是的!你是对的。 – IgnacioF

+0

每行上的最后一个括号是否总是标记第一个字段的结尾?已知的字段数(这里是4)? –

回答

3

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

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

regex demo(与\s更换空间以上更好的可见度)。

图案的详细资料

  • (\((?:[^()]++|(?1))*\))(*SKIP)(*F) - 第1组匹配
    • \((?:[^()]++|(?1))*\) - 一个子呈现平衡括号子:\(匹配((?:[^()]++|(?1))*匹配零个或多个(*)的序列除了()(见[^()]++)以外的1+字符或整个组的整个模式1(见subrouting呼叫(?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" 
+0

谢谢!它似乎工作正常。你能解释一下你使用的正则表达式吗? – IgnacioF

+0

请检查我的答案。如果解释不够,请参阅[Regex递归](http://www.regular-expressions.info/recurse。html)和[Subroutines](http://www.regular-expressions.info/subroutine.html)。此外,请参阅[如何(* SKIP)或(* F)在正则表达式上工作?](http://stackoverflow.com/questions/24534782/how-do-skip-or-f-work-on-regex)。 –

相关问题