【问题标题】:Remove part of a string删除字符串的一部分
【发布时间】:2012-03-31 01:04:54
【问题描述】:

如何删除字符串的一部分?例如在ATGAS_1121 中我想删除_ 之前的所有内容。

【问题讨论】:

    标签: r regex string


    【解决方案1】:

    使用正则表达式。在这种情况下,您可以使用gsub

    gsub("^.*?_","_","ATGAS_1121")
    [1] "_1121"
    

    此正则表达式匹配字符串的开头 (^)、任何重复零次或多次的字符 (.) (*) 和下划线 (_)。这 ?使匹配“惰性”,以便它只匹配第一个下划线。该匹配项仅替换为一个下划线。请参阅?regex 了解更多详情和参考

    【讨论】:

    • gsub("^.*_","_","ATGAS_1121_xxx") 的情况下,前一个正则表达式将匹配最后一个下划线。现已修复。
    • @Joshua 我觉得你解释了正则表达式的作用真的很有用。
    • 这也适用于字符串向量作为最后一个参数。 R 就是这么棒。
    【解决方案2】:

    您可以为此使用内置的strsplit

    > s = "TGAS_1121"
    > s1 = unlist(strsplit(s, split='_', fixed=TRUE))[2]
    > s1    
     [1] "1121"
    

    strsplit 将在 split 参数上解析的字符串的 both 片段返回为 list。这可能不是您想要的,所以将调用包装在 unlist 中,然后在 index 该数组中,以便只返回向量中两个元素中的第二个。

    最后,fixed参数要设置为TRUE,表示split参数不是正则表达式,而是文字匹配字符。

    【讨论】:

      【解决方案3】:

      如果您是 Tidyverse 类型的人,这里是 stringr 解决方案:

      R> library(stringr)
      R> strings = c("TGAS_1121", "MGAS_1432", "ATGAS_1121") 
      R> strings %>% str_replace(".*_", "_")
      [1] "_1121" "_1432" "_1121"
      # Or:
      R> strings %>% str_replace("^[A-Z]*", "")
      [1] "_1121" "_1432" "_1121"
      

      【讨论】:

        【解决方案4】:

        如果s 是向量,则这是strsplit 解决方案:

        > s <- c("TGAS_1121", "MGAS_1432")
        > s1 <- sapply(strsplit(s, split='_', fixed=TRUE), function(x) (x[2]))
        > s1
        [1] "1121" "1432"
        

        【讨论】:

        • 非常有帮助,谢谢!仅供参考,以获取字符串的第一部分(即在“_”之前),将末尾的 [2] 替换为 [1]。
        【解决方案5】:

        也许最直观的解决方案可能是使用stringr 函数str_remove,它比str_replace 更容易,因为它只有1 个参数而不是2 个。

        您的示例中唯一棘手的部分是您希望保留下划线,但这是可能的:您必须匹配正则表达式,直到它找到指定的字符串模式 (?=pattern)

        查看示例:

        strings = c("TGAS_1121", "MGAS_1432", "ATGAS_1121")
        strings %>% stringr::str_remove(".+?(?=_)")
        
        [1] "_1121" "_1432" "_1121"
        

        【讨论】:

          【解决方案6】:

          这里是使用dplyr 包的数据框的strsplit 解决方案

          col1 = c("TGAS_1121", "MGAS_1432", "ATGAS_1121") 
          col2 = c("T", "M", "A") 
          df = data.frame(col1, col2)
          df
                  col1 col2
          1  TGAS_1121    T
          2  MGAS_1432    M
          3 ATGAS_1121    A
          
          df<-mutate(df,col1=as.character(col1))
          df2<-mutate(df,col1=sapply(strsplit(df$col1, split='_', fixed=TRUE),function(x) (x[2])))
          df2
          
            col1 col2
          1 1121    T
          2 1432    M
          3 1121    A
          

          【讨论】:

            猜你喜欢
            • 2017-05-11
            • 2018-12-07
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-07-02
            相关资源
            最近更新 更多