【问题标题】:R regular expression to obtain all text before the second underscoreR正则表达式获取第二个下划线之前的所有文本
【发布时间】:2016-11-17 09:55:36
【问题描述】:
s <- "1-343-43Hello_2_323.14_fdh-99H"

在 R 中,我想使用正则表达式来获取第二个下划线之前的子字符串。如何使用一个正则表达式来完成?另一种方法是用 '_' 分割,然后粘贴前两个 - 一些东西;

paste(sapply(strsplit(s, "_"),"[", 1:2), collapse = "_")

给:

[1] "1-343-43Hello_2"

但是我怎样才能使一个正则表达式来做同样的事情呢?

【问题讨论】:

    标签: regex r split


    【解决方案1】:

    您可以使用sub

    sub("^([^_]*_[^_]*).*", "\\1", s)
    

    regex demo

    R code demo:

    s <- "1-343-43Hello_2_323.14_fdh-99H"
    sub("^([^_]*_[^_]*).*", "\\1", s)
    ## => [1] "1-343-43Hello_2"
    

    模式详情

    • ^ - 字符串开头
    • ([^_]*_[^_]*) - 第 1 组捕获除 _ 之外的 0+ 个字符,然后是 _,然后是 0+ 个非_s
    • .* - 字符串的其余部分(注意 TRE 正则表达式 . 也匹配换行符)。

    \\1 替换只返回组 1 内的值。

    【讨论】:

      【解决方案2】:
      echo preg_replace("/([^_])_([^_]).*/" , "$1_$2" , "1-343-43Hello_2_323.14_fdh-99H");
      

      或者如果您正在寻找匹配的 int /^[^]*[^_]*/ 将是匹配它的正则表达式字符串

      <?php
          echo preg_match("/^[^_]*_[^_]*/" , "1-343-43Hello_2_323.14_fdh-99H" , $test );
          var_dump( $test );
      ?>
      

      或在javascript中

      "1-343-43Hello_2_323.14_fdh-99H".match(/^[^_]*_[^_]*/);
      

      【讨论】:

      • 问题明显是关于 R.
      • 对不起,我没听懂
      【解决方案3】:

      一般来说,为了回答标题中的问题,是

      sub("^(([^_]*_){n}[^_]*).*", "\\1", s)
      

      其中n 是您允许的_ 的数量。

      【讨论】:

      • 其实n是下划线的个数减1所以如果你想允许2个下划线那么n就是1。
      • @G.Grothendieck 不,不是。
      • 你是对的,但问题是指“在第二个下划线之前的子字符串”并且对于那个 n = 1,而不是 2,这就是我试图澄清但显然错误的.无论如何,我确实给了你一个支持,因为你提供了最普遍的答案。
      【解决方案4】:
      sub('\\_\\d+\\..*$','',s)
      #[1] "1-343-43Hello_2"
      

      【讨论】:

        【解决方案5】:

        这里是 gsub(在 data.table 中),以防您需要 perl=TRUE,(fx 前瞻和后视),不幸的是,这在 str_match 中不起作用

        dtx[, var_stringr := stringr::str_match(string, '([^_]+)(?:_[^_]+){5}$')[,2]][]
        
        
        dtx[
          # first select the ones with '_' so that the third element is NA
          grepl('_', string), 
          var_gsub := sub('(.*_)([^_]+)(_[^_]+){5}$',  '\\2', string)][]
        

        这种方法的缺点是,如果你选择一个高于第n次出现的数字,而不是像str_match那样返回NA,它会返回整个字符串。

        【讨论】:

          猜你喜欢
          • 2012-01-29
          • 1970-01-01
          • 2021-02-10
          • 2011-05-25
          • 1970-01-01
          • 2019-11-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多