【问题标题】:R get rid of string before/after special characters (pipe and <>) using regexR使用正则表达式在特殊字符(管道和<>)之前/之后摆脱字符串
【发布时间】:2021-06-30 03:37:10
【问题描述】:

我正在尝试删除字符串中特殊字符之前或之后的字符。

我的示例字符串如下所示:

test <- c(">P01923|description", ">P19405orf|description2")

我正在尝试获取&gt; 键和| 键之间的部分,这样我就只剩下c("P01923", "P19405orf") 了。我试图通过两次使用gsub 来做到这一点,首先摆脱| 后面的所有内容,然后摆脱&gt;

我第一次尝试这个:gsub("|.*, "", test) 但这似乎删除了所有字符(不知道为什么?)。我使用 regex101.com 网站检查了我的正则表达式,发现| 是一个特殊字符,我需要改用\|,这在 regex101.com 网站上有效,所以我尝试了gsub("\|.*", "", test),但是这给了我一个错误说"\|' is an unrecognized escape in character string starting ""\|"&gt; 也有同样的问题。

如何让 R 使用正则表达式识别 |&gt; 等特殊字符?

【问题讨论】:

    标签: r regex


    【解决方案1】:

    如果您使用"..." 指定字符常量,您还需要转义导致\\\。但您也可以使用r"(...)" 指定原始 字符常量,您可以使用一个\

    gsub(".*>|\\|.*", "", test)
    [1] "P01923"    "P19405orf"
    
    gsub(r"(.*>|\|.*)", "", test)
    [1] "P01923"    "P19405orf"
    

    这里.*&gt; 删除了之前的所有内容和&gt;\|.* 删除了| 及其之后的所有内容,而两者之间的| 是一个或。

    或者regexprregmatches 可以像这样使用:

    regmatches(test, regexpr("(?<=>)[^|]*", test, perl=TRUE))
    #[1] "P01923"    "P19405orf"
    

    其中(?&lt;=&gt;)&gt; 的后缀,[^|]* 匹配所有内容,但不匹配|

    【讨论】:

      【解决方案2】:

      您可以在&gt;| 之间提取文本。特殊字符可以用\\转义。

      sub('>(.*)\\|.*', '\\1', test)
      #[1] "P01923"    "P19405orf"
      

      【讨论】:

      • 谢谢!我很困惑,因为正则表达式网站似乎可以识别 `` 但我无法让它在 R 中工作,我猜该网站并不总是使用与 R 相同的语法。
      • 是的,通常正则表达式网站使用单斜杠 \ 来转义特殊字符,而 R 使用两个。
      • 这里的 R 并没有什么特别之处。在正则表达式上下文中,两个反斜杠表示一个文本反斜杠。四个反斜杠可用于表示实际的反斜杠字符。
      【解决方案3】:

      这是一个正则表达式拆分选项。我们可以在[&gt;|]上拆分输入字符串,这样会将所需的子字符串留在输出向量的第二个位置。

      test <- c(">P01923|description", ">P19405orf|description2")
      unlist(lapply(strsplit(test, "[>|]"), function(x) x[2]))
      
      [1] "P01923"    "P19405orf"
      

      【讨论】:

        【解决方案4】:
        library(stringr)
        
        test <- c(">P01923|description", ">P19405orf|description2")
        
        #if '>' is always the first character
        str_sub(test, 2, -1) %>%
          str_replace('\\|.*$', '')
        #> [1] "P01923"    "P19405orf"
        
        #if not
        str_replace(test, '\\>', '') %>%
          str_replace('\\|.*$', '')
        #> [1] "P01923"    "P19405orf"
        
        #alternative way 
        str_match(test, '\\>(.*)\\|')[, 2]
        #> [1] "P01923"    "P19405orf"
        

        reprex package (v2.0.0) 于 2021-06-30 创建

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-07-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多