【问题标题】:Subset a part of a string before a certain pattern在某个模式之前对字符串的一部分进行子集
【发布时间】:2018-07-18 06:48:30
【问题描述】:

我的 row.names 看起来像这样:

输入:

 S1_S2_S3_S9_AAACTGATFSRYB
 S3_S4_S12_S1_TTTTTTGATFSRYB
 S9_S4_S12_S1_S2_S19_S22_GTGTTTGATFSRYB        

我想要以下内容:

 S9_AAACTGATFSRYB
 S1_TTTTTTGATFSRYB
 S22_GTGTTTGATFSRYB 

换句话说,我只想保留字母开始前的最后一个 S*。 我总共有 6000 行

谁能帮我写一个 gsub 或类似的东西来提取我需要的字符串?

【问题讨论】:

    标签: r regex gsub


    【解决方案1】:

    试试这个

    a =c(
    "S1_S2_S3_S9_AAACTGATFSRYB",
    "S3_S4_S12_S1_TTTTTTGATFSRYB",
    "S9_S4_S12_S1_S2_S19_S22_GTGTTTGATFSRYB"
    )
    
    
    gsub("^.*_(.*_.+)$","\\1",a)
    #> [1] "S9_AAACTGATFSRYB"   "S1_TTTTTTGATFSRYB"  "S22_GTGTTTGATFSRYB"
    

    reprex package (v0.2.0.9000) 于 2018 年 7 月 18 日创建。


    编辑:添加对正则表达式的解释:

    • ^.*_ 匹配从开头(^)到最后一个下划线的字符串
    • (.*_.+) 匹配带下划线的字符串,结合第一部分,将匹配最后一个下划线和周围,这就是我们想要的。
    • ()\1:

      反向引用 \N,其中 N = 1 ... 9,匹配先前由正则表达式的第 N 个带括号的子表达式匹配的子字符串。

    【讨论】:

    • ".*_(.*_)" 应该这样做
    【解决方案2】:

    正则表达式解决方案:

    sapply(strsplit(a, "_"), function(i) paste(tail(i, n = 2), collapse = "_"))
    # [1] "S9_AAACTGATFSRYB"   "S1_TTTTTTGATFSRYB"  "S22_GTGTTTGATFSRYB"
    

    【讨论】:

      【解决方案3】:

      使用正则表达式和字符串的替代方法

      stringr::str_extract(a,"[^_]+_[^_]+$")
      #[1] "S9_AAACTGATFSRYB"   "S1_TTTTTTGATFSRYB"  "S22_GTGTTTGATFSRYB"
      

      【讨论】:

        猜你喜欢
        • 2013-05-04
        • 2013-03-28
        • 1970-01-01
        • 2020-11-23
        • 2021-02-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多