r-提取3个下划线之间的值



我试图通过下划线提取字符串的一部分,包括一个下划线:

20220801_NM7_Chrom_2399_A12_CCIH.CSV

我想得到的输出

Chrom_2399

我的代码在这里

x = "20220801_NM7_Chrom_2399_A12_CCIH.CSV"
gsub("^(?:[^_]+_){2}([^_]+).*", "\1", x)

它给了我

[1] "Chrom"

如何更正?

尝试:

^(([^_]+)_(?2))_((?1)).*

查看在线演示

  • ^——起始线锚
  • (-打开第一个捕获组(子模式(;
    • ([^_]+)-第二个嵌套捕获组,用于匹配除下划线以外的1个以上字符
    • _(?2)-将下划线和反向引用匹配到第二个子模式,以再次匹配除下划线以外的1+个字符
    • )—关闭第一个捕获组/子模式
  • _((?1))-匹配一个下划线,打开一个与第一组中使用的整个子模式匹配的第三个捕获组
  • .*-匹配换行符以外的0+个字符

我们现在可以在替换值中使用第三个捕获组:

s  = "20220801_NM7_Chrom_2399_A12_CCIH.CSV"
gsub("^(([^_]+)_(?2))_((?1)).*", "\3", s, perl = T)

打印:

[1] "Chrom_2399"

或者使用:

library(strex)
s  = "20220801_NM7_Chrom_2399_A12_CCIH.CSV"
str_before_nth(str_after_nth(s, "_", 2), "_", 2)

这样?

x <- "20220801_NM7_Chrom_2399_A12_CCIH.CSV"
sub("^([^_]+_){2}([^_]+_[^_]+)_.*", "\2", x)
#> [1] "Chrom_2399"

创建于2022-09-03由reprex包(v2.0.1(

您可以使用stringr包尝试以下代码。

library(stringr)
x <- "20220801_NM7_Chrom_2399_A12_CCIH.CSV"
paste0(str_split(x, pattern = "_")[[1]][3],"_",str_split(x, pattern = "_")[[1]][4])
x <- "20220801_NM7_Chrom_2399_A12_CCIH.CSV"
> stringr::str_extract_all(x, pattern = "[:alpha:]+_[:digit:]+")
[[1]]
[1] "Chrom_2399"

最新更新