在特定模式之前将字符串的一部分细分

时间:2018-07-18 06:48:30

标签: r regex gsub

我有 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 或类似的东西来提取我需要的字符串吗?

3 个答案:

答案 0 :(得分:5)

尝试

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-07-18。


编辑:在正则表达式上添加说明:

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

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

答案 1 :(得分:1)

regex 解决方案:

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

答案 2 :(得分:0)

使用正则表达式和Stringr的替代方法

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