【问题标题】:R strsplit before ( and after ) keeping both delimitersR strsplit before ( 和 after ) 保留两个分隔符
【发布时间】:2014-09-29 09:03:33
【问题描述】:

我有一个如下所示的字符串:

x <- "01(01)121210(01)0001"

我想将其拆分为一个向量,以便得到以下信息:

[1] "0" "1" "(01)" "1" "2" "1" "2" "1" "0" "(01)" "0" "0" "0" "1"

(|) 可以是 [|] 或 {|},括号之间的位数可以是 2 或更多。

我一直在尝试通过先在括号上分开来做到这一点:

unlist(strsplit(x, "(?<=[\\]\\)\\}])", perl=T))
[1] "01(01)" "121210(01)" "0001"

or unlist(strsplit(x, "(?<=[\\[\\(\\{])", perl=T))
[1] "01(" "01)121210(" "01)0001"

但我找不到将两者结合在一起的方法。 然后,我希望拆分不包含括号的元素。

如果有人能帮我解决这个问题或知道更优雅的方法,我将不胜感激。

非常感谢!

【问题讨论】:

    标签: regex r delimiter strsplit


    【解决方案1】:

    只需将 PERL 选项更改为 TRUE 并根据以下模式拆分输入字符串。

    (?<!\(|^)(?!\)|\d\)|$)
    

    DEMO

    R 正则表达式是,

    "(?<!\\(|^)(?!\\)|\\d\\)|$)"
    

    【讨论】:

      【解决方案2】:

      使用 gsubfn 包中的 strapply 可以在不使用零宽度前瞻/后向表达式的情况下完成此操作。正则表达式匹配一个数字或一个 ( 直到下一个 )。

      library(gsubfn)
      
      strapply(x, "\\d|\\(.*?\\)", c, perl = TRUE)[[1]]
      

      给予:

       [1] "0"    "1"    "(01)" "1"    "2"    "1"    "2"    "1"    "0"    "(01)"
      [11] "0"    "0"    "0"    "1"  
      

      注意:在问题中显示的示例中,(...) 中的部分始终为两位数。如果总是这样,它可以进一步简化为:

      strapplyc(x, "\\d|\\(...")[[1]]
      

      更新添加注释。

      【讨论】:

      • 在这种情况下为什么不使用gregexpr
      • 因为简单。
      • grexexpr 单独不是一个解决方案。显然这里显示的解决方案更简单。
      • 我在问你同样的模式(显然)。换句话说就是这样:m&lt;-gregexpr("\\d|\\(.*?\\)", x) regmatches(x, m)
      • 这涉及到提取索引,然后对其应用第二个操作——当它可以在单个命令中完成时并不简单。此外,如果您想对每个输出组件进行某些操作,c 可以用任意函数替换,而不会增加太多复杂性。
      【解决方案3】:

      这是另一种方式:

      unlist(strsplit(x, '\\([^)]*\\)(*SKIP)(*F)|(?=)', perl=T))
      # [1] "0"    "1"    "(01)" "1"    "2"    "1"    "2"    "1"    "0"    "(01)" "0"    "0"    "0"    "1" 
      

      \\([^)]*\\) 匹配括号中的任何内容,(*SKIP)(*F) 告诉正则表达式引擎在此模式上失败,如果它在字符串中找到该模式,则不要使用替代模式重新测试该部分字符串| 的另一边。 | 另一边的模式是(?=),这匹配字符之间的空格。

      【讨论】:

      • 我也很喜欢这个答案,但似乎只能选择一个。对此真的很抱歉。顺便说一句,我将如何修改它以使用 { } 或 [ ] ?
      【解决方案4】:

      另一种可能的方式:

      unlist(strsplit(x, '(?!\\(?\\d*\\))', perl=T))
      

      比 Matthew Plourde 方式更短但效率更低

      或者像 G. Grothendieck 所写的那样:

      m<-gregexpr("\\d|\\([^)]*\\)", x)
      regmatches(x, m)
      

      【讨论】:

        猜你喜欢
        • 2017-11-24
        • 2022-11-03
        • 2018-12-25
        • 1970-01-01
        • 1970-01-01
        • 2019-05-11
        • 2021-07-14
        • 1970-01-01
        • 2022-06-15
        相关资源
        最近更新 更多