在R中使用strsplit(),忽略括号中的任何内容

时间:2016-02-11 18:45:26

标签: regex r strsplit

我试图在R中使用strsplit()根据逗号将字符串分成几部分,但我不想在括号中拆分任何内容。我认为答案是正则表达式,但我正在努力使代码正确。

例如:

x <- "This is it, isn't it (well, yes)"
> strsplit(x, ", ")
[[1]]
[1] "This is it"     "isn't it (well" "yes)" 

当我想要的是:

[1] "This is it"     "isn't it (well, yes)"

3 个答案:

答案 0 :(得分:15)

我们可以使用PCRE正则表达式FAIL ,之前( )之前的,\\s*后跟 strsplit(x, '\\([^)]+,(*SKIP)(*FAIL)|,\\s*', perl=TRUE)[[1]] #[1] "This is it" "isn't it (well, yes)" 0个或更多空格({{1}})

{{1}}

答案 1 :(得分:6)

我建议使用compile (rootProject.ext.jbossBom) { exclude group: "some.group", module: "some.module" } 的另一个正则表达式忽略所有(*SKIP)(*F)子字符串,并且只匹配带括号的子字符串之外的逗号:

(...)

请参阅IDEONE demo

您可以在此处详细了解How do (*SKIP) or (*F) work on regex?。正则表达式匹配:

  • x <- "This is it, isn't it (well, yes), and (well, this, that, and this, too)" strsplit(x, "\\([^()]*\\)(*SKIP)(*F)|\\h*,\\h*", perl=T) - 一个开头括号
  • \( - 除[^()]*(以外的零个或多个字符
  • ) - 结束括号
  • \) - 将当前正则表达式索引推进到结束括号后的位置的动词
  • (*SKIP)(*F) - 或......
  • | - 包含零个或多个水平空格的逗号。

答案 2 :(得分:1)

另一种方法:

添加@ Wiktor的示例字符串,

x <- "This is it, isn't it (well, yes), and (well, this, that, and this, too). Let's look, does it work?"

现在魔术:

> strsplit(x, ", |(?>\\(.*?\\).*?\\K(, |$))", perl = TRUE)
[[1]]
[1] "This is it"                                       
[2] "isn't it (well, yes)"                             
[3] "and (well, this, that, and this, too). Let's look"
[4] "does it work?"  

那么, |(?>\\(.*?\\).*?\\K(, |$))如何匹配?

  • |捕获两侧的任何一组,两者都有
    • 在左侧,字符串,
    • 并在右侧(?>\\(.*?\\).*?\\K(, |$))
      • (?> ... )设置an atomic group,不允许回溯重新评估匹配的内容。
      • 在这种情况下,它会查找左括号(\\(),
      • 然后任何字符(.)从0到无穷大(*)重复,但尽可能少(?),即.被懒惰地评估。
      • 之前的.重复受第一个右括号(\\))的限制,
      • 后跟另一组任意字符,重复0到尽可能少(.*?
      • 最后有a \\K,它会抛弃到目前为止的比赛并设置新比赛的起点。
      • 之前的.*?受限于具有( ... )的捕获组(|
        • 选择实际的文字字符串,
        • 如果没有逗号,则
        • 或将\\K移至该行$的末尾。

*呼。*

如果我的解释令人困惑,请参阅上面链接的文档,然后查看regex101.com,您可以在其中放入上述正则表达式(单个转义 - \ - 而不是R-style double escapeped- \\)和一个测试字符串,以查看它匹配的内容,并获得它正在做什么的解释。您需要在正则表达式框旁边的框中设置g(全局)修饰符以显示所有匹配项,而不仅仅是第一个匹配项。

快乐strsplit ing!