【问题标题】:Split string by space except what's inside parentheses除括号内的内容外,按空格分割字符串
【发布时间】:2016-09-27 20:22:10
【问题描述】:

我有以下字符串:

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

提前致谢!

【问题讨论】:

  • 看起来你的字符串已经嵌套了平衡(),你需要跳过balanced括号内的那些空格,对吧?
  • 是的!你是对的。
  • 每行的最后一个括号是否总是标记第一个字段的结尾?字段数是否已知(此处为 4)?
  • 关于你的第二个问题:不,他们不是。这只是许多可能性的一个例子。我不是在第一个关注你,你是在问我所有的案例是否都遵循相同的模式,即第一个字段是嵌套的?

标签: r regex strsplit


【解决方案1】:

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

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

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

模式详情

  • (\((?:[^()]++|(?1))*\))(*SKIP)(*F) - 组 1 匹配
    • \((?:[^()]++|(?1))*\) - 表示平衡括号子字符串的子字符串:\( 匹配 ((?:[^()]++|(?1))* 匹配零个或多个 (*) 的 1+ 字符序列,而不是 ()(参见 @ 987654336@) 或整个组 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"

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2015-09-03
  • 1970-01-01
  • 2017-04-25
  • 1970-01-01
  • 2012-08-03
  • 1970-01-01
  • 2011-01-28
相关资源
最近更新 更多