MAP*_*APK 24 regex string split r
我有这个mystring分隔符_.这里的条件是如果有两个或多个分隔符,我想在第二个分隔符处拆分,如果只有一个分隔符,我想分割".Recal"并得到result如下所示的分隔符.
mystring<-c("MODY_60.2.ReCal.sort.bam","MODY_116.21_C4U.ReCal.sort.bam","MODY_116.3_C2RX-1-10.ReCal.sort.bam","MODY_116.4.ReCal.sort.bam")
Run Code Online (Sandbox Code Playgroud)
结果
"MODY_60.2" "MODY_116.21" "MODY_116.3" "MODY_116.4"
Run Code Online (Sandbox Code Playgroud)
pic*_*ick 11
你可以使用 gsubfn
library(gsubfn)
f <- function(x,y,z) if (z=="_") y else strsplit(x, ".ReCal", fixed=T)[[1]][[1]]
gsubfn("([^_]+_[^_]+)(.).*", f, mystring, backref=2)
# [1] "MODY_60.2" "MODY_116.21" "MODY_116.3" "MODY_116.4"
Run Code Online (Sandbox Code Playgroud)
这允许您有两个以上"_"的情况,并且您希望在第二个上分割,例如,
mystring<-c("MODY_60.2.ReCal.sort.bam",
"MODY_116.21_C4U.ReCal.sort.bam",
"MODY_116.3_C2RX-1-10.ReCal.sort.bam",
"MODY_116.4.ReCal.sort.bam",
"MODY_116.4_asdfsadf_1212_asfsdf",
"MODY_116.5.ReCal_asdfsadf_1212_asfsdf", # split by second "_", leaving ".ReCal"
"MODY")
gsubfn("([^_]+_[^_]+)(.).*", f, mystring, backref=2)
# [1] "MODY_60.2" "MODY_116.21" "MODY_116.3" "MODY_116.4"
# [5] "MODY_116.4" "MODY_116.5.ReCal" "MODY"
Run Code Online (Sandbox Code Playgroud)
在功能方面,f,x是原始的字符串,y并且z是一个相匹配.因此,如果z不是"_",则继续通过替代字符串进行拆分.
随stringr包裹:
str_extract(mystring, '.*?_.*?(?=_)|^.*?_.*(?=\\.ReCal)')
[1] "MODY_60.2" "MODY_116.21" "MODY_116.3" "MODY_116.4"
Run Code Online (Sandbox Code Playgroud)
它也适用于两个以上的分隔符.
Perl/PCRE具有分支重置功能,允许您在使用不同备选方案捕获组时重用组号,并将其视为一个捕获组.
IMO,当您想提供不同的替代品时,此功能非常优雅.
x <- c('MODY_60.2.ReCal.sort.bam', 'MODY_116.21_C4U.ReCal.sort.bam',
'MODY_116.3_C2RX-1-10.ReCal.sort.bam', 'MODY_116.4.ReCal.sort.bam',
'MODY_116.4_asdfsadf_1212_asfsdf', 'MODY_116.5.ReCal_asdfsadf_1212_asfsdf', 'MODY')
sub('^(?|([^_]*_[^_]*)_.*|(.*)\\.ReCal.*)$', '\\1', x, perl=T)
# [1] "MODY_60.2" "MODY_116.21" "MODY_116.3" "MODY_116.4"
# [5] "MODY_116.4" "MODY_116.5.ReCal" "MODY"
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1533 次 |
| 最近记录: |