如何在R语言中使用正则表达式处理样本条码?
处理TCGA样本条码:保留前4个分隔子串并截断第4个的最后一位
需求说明
移除样本条码中的冗余内容,保留前4个以短横线分隔的子串,同时去掉第4个子串的最后一个字符。
原代码问题
你当前的正则表达式^([^-]*-[^-]*-[^-]*-[^-]*).{1}$无法满足需求:
- 它仅匹配字符串末尾的1个字符并移除,但输入条码的冗余内容是第4个分隔子串之后的所有部分,且第4个子串本身还有额外字符(比如
01A里的A) - 原正则的
[^-]*会匹配完整的第4个子串(比如01A),没有截断最后一位的逻辑
解决方案
这里提供两种可靠的实现方式:
方法1:改进正则表达式
使用更精准的正则来捕获目标内容,忽略后续所有冗余部分:
sub.maf.barcode <- gsub("^([^-]*-[^-]*-[^-]*-[^-])(?:.*)$", "\\1", ori.maf.barcode$Tumor_Sample_Barcode)
- 正则解析:
^([^-]*-[^-]*-[^-]*-[^-]):捕获前3个完整子串,加上第4个子串的前n-1个字符([^-]匹配除短横线外的单个字符,对应第4个子串去掉最后一位)(?:.*)$:非捕获组,匹配从第4个子串剩余部分到字符串结尾的所有内容- 替换为
\\1,只保留捕获到的目标内容
方法2:分割重组(更直观易读)
如果觉得正则不好维护,可以用strsplit分割后再拼接:
# 分割每个条码为子串列表 barcode_parts <- strsplit(ori.maf.barcode$Tumor_Sample_Barcode, "-") # 处理每个条码:取前4个部分,截断第4个的最后一位,再拼接 sub.maf.barcode <- sapply(barcode_parts, function(x) { x[4] <- substr(x[4], 1, nchar(x[4])-1) paste(x[1:4], collapse = "-") })
测试验证
输入示例:
> ori.maf.barcode$Tumor_Sample_Barcode[1:5] [1] "TCGA-2K-A9WE-01A-11D-A382-10" "TCGA-2Z-A9J1-01A-11D-A382-10" [3] "TCGA-2Z-A9J2-01A-11D-A382-10" "TCGA-2Z-A9J3-01A-12D-A382-10" [5] "TCGA-2Z-A9J5-01A-21D-A382-10"
使用上述任一方法后,输出结果:
> sub.maf.barcode[1:5] [1] "TCGA-2K-A9WE-01" "TCGA-2Z-A9J1-01" [3] "TCGA-2Z-A9J2-01" "TCGA-2Z-A9J3-01" [5] "TCGA-2Z-A9J5-01"
内容的提问来源于stack exchange,提问作者melolilili
相关产品推荐
相关产品推荐

