我有以下字符串:
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
提前致谢!
答案 0 :(得分:3)
我认为你需要一个匹配平衡括号的正则表达式然后跳过它们,然后匹配剩下的空格与以下基于PCRE的正则表达式:
(\((?:[^()]++|(?1))*\))(*SKIP)(*F)|\s
请参阅regex demo(用上面的\s
替换空格以获得更好的可见性。)
模式详情:
(\((?:[^()]++|(?1))*\))(*SKIP)(*F)
- 第1组匹配
\((?:[^()]++|(?1))*\)
- 呈现平衡括号子字符串的子字符串:\(
匹配(
,(?:[^()]++|(?1))*
匹配零个或多个(*
)1+序列(
和)
以外的字符(请参阅[^()]++
)或整个第1组的整个模式(请参阅子路由调用(?1)
),然后\)
匹配文字)
和(*SKIP)(*F)
使正则表达式丢弃整个匹配的文本,同时保持正则表达式索引在该匹配结束时,继续寻找下一个匹配|
- 或
- 要分割的空间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"