分割字符串括号
我有以下字符串:分割字符串括号
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 parentheses和 Using strsplit() in R, ignoring anything in parentheses
感谢:
我阅读下面的答案,但我不能让它在我的情况下工作!
我认为你需要一个正则表达式匹配平衡的括号,然后跳过它们,然后匹配留在下列基于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"
谢谢!它似乎工作正常。你能解释一下你使用的正则表达式吗? – IgnacioF
请检查我的答案。如果解释不够,请参阅[Regex递归](http://www.regular-expressions.info/recurse。html)和[Subroutines](http://www.regular-expressions.info/subroutine.html)。此外,请参阅[如何(* SKIP)或(* F)在正则表达式上工作?](http://*.com/questions/24534782/how-do-skip-or-f-work-on-regex)。 –
看起来像你的字符串嵌套了平衡'()',你需要跳过里面*平衡*括号中的空间,对不对? –
是的!你是对的。 – IgnacioF
每行上的最后一个括号是否总是标记第一个字段的结尾?已知的字段数(这里是4)? –