如何在R的gsub()中仅返回匹配成功的结果?
解决方案
可以用以下几种方式实现,只需要一次正则逻辑就能完成筛选和提取,不用重复写^S.*\.:
方法1:Base R 原生方法(无需额外包)
利用regexec和regmatches提取匹配组,同时自动过滤不匹配的项:
test <- c("Sample1.data", "Sample2.info", "S123.results", "Sabc.temp", "Other.data", "Sxyz.final", "Sample3", "xaaa") # 提取匹配组并去重 matches <- regexec("^S.*\\.(.*)$", test) output <- unique(sapply(regmatches(test, matches), function(x) x[2])) # 移除NA(不匹配的项会返回NA) output <- output[!is.na(output)] output # [1] "data" "info" "results" "temp" "final"
正则^S.*\\.(.*)$的作用是:匹配以S开头、包含.的字符串,并捕获.后面的所有内容作为提取目标。
方法2:Base R 简化版
用sub结合逻辑过滤,写法更简洁,还可以把正则存成变量避免重复书写:
pattern <- "^S.*\\." output <- unique(sub(paste0(pattern, "(.*)$"), "\\1", test[grepl(pattern, test)])) output
方法3:stringr包(更直观)
如果常用字符串处理,stringr的str_extract可以直接提取目标内容,不匹配的项会返回NA,后续只需过滤NA并去重:
library(stringr) output <- unique(str_extract(test, "(?<=^S.*\\.).*")) output <- output[!is.na(output)] output
正则(?<=^S.*\\.).*用正向预查确保前面是S开头直到.,然后提取后面的所有字符,逻辑更直观。
内容的提问来源于stack exchange,提问作者user20185627
相关产品推荐
相关产品推荐

