我试图通过下划线提取字符串的一部分,包括一个下划线:
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"