R语言数据框中使用正则提取含HSPs条目的物种名与scaffold名称
R语言正则提取Names列HSPs位点信息实现方案
核心实现逻辑
- 无需提前拆分Names列中逗号分隔的多段位点,通过正则直接锚定
HSPs标记位置,一次捕获两个目标字段。 - 正则匹配时自动兼容三种位点边界:字符串最开头、逗号分隔的中间位置、字符串最末尾,同时自动排除方括号、分隔逗号等无关注扰字符。
匹配正则拆解
完整匹配正则为:(?:^\\[?|,)([^,\\]]+?)-HSPs.*?__([^,\\]]+)
各部分作用:
(?:^\\[?|,):非捕获组,定位位点的起始边界,匹配字符串开头(带可选的左方括号)或者逗号分隔符,不占用捕获位。([^,\\]]+?):捕获组1,非贪婪匹配到-HSPs之前的所有字符,排除逗号、右方括号,拿到-HSPs前面的原始序列文本。-HSPs:固定锚定目标标记的位置,作为序列和后续文本的分割点。.*?:非贪婪匹配HSPs标记到双下划线之间的链方向文本。__:定位物种名的起始边界。([^,\\]]+):捕获组2,匹配双下划线之后、到逗号或右方括号之前的所有字符,拿到原始物种名。
可运行完整代码
library(dplyr) library(stringr) # 载入原始测试数据 df <- structure(list(Names = structure(c(1L, 3L, 4L, 2L), .Label = c( "[NW_019417116.1_3-HSPs_-__Canis_glabripennis]", "[scaffold_27087_+__Falis_catus,scaffold_77874_2-HSPs_-__Ratus_griseus]", "[scaffold_29690_2-HSPs_-__Lopus_eremicus,scaffold_3037_+__Pig_sd,scaffold_144501_556-844_+__Lopus_eremicus]", "[UDEW01029642.1_1-357_+__Falis_catus,scaffold_100683_331-631_+__Pig_sud,scaffold_209026_2-HSPs_+__Pig_sud,scaffold_220973_58-331_+__Pig_sud]" ), class = "factor")), class = "data.frame", row.names = c(NA, -4L)) # 提取生成结果数据框 result_df <- df %>% mutate( # 一次正则匹配拿到两个捕获值 match_res = str_match(Names, "(?:^\\[?|,)([^,\\]]+?)-HSPs.*?__([^,\\]]+)"), # 处理scaffold名:去掉序列结尾的_数字坐标位 Scaffold_name = str_remove(match_res[, 2], "_\\d+$"), # 直接取双下划线后的物种名 Specie_name = match_res[, 3] ) %>% # 删除临时匹配列,保留目标列顺序 select(Names, Specie_name, Scaffold_name)
原代码问题说明
- 原代码匹配scaffold时强制要求位点前面有逗号,导致字符串开头的单位点(如第一行只有一个HSPs片段的场景)无法匹配到结果。
- 原代码提取物种名时用多段gsub逐次清洗逗号、方括号,容易误删其他位置的有效文本,且匹配规则没有锚定双下划线位置,提取结果不稳定。
内容的提问来源于stack exchange,提问作者chippycentra
相关产品推荐
相关产品推荐

