如何用R的gsub正则匹配REVESTI后AMIDO/TALCO并批量替换
解决方案
原代码的问题在于只匹配了REVEST开头单词后的第一个AMIDO/TALCO,既没有处理后续出现的目标词,也未清除掉目标词之外的无关内容,导致输出不符合预期。
方法一:分步骤处理(清晰直观)
通过提取目标内容、筛选关键词、格式化替换的方式实现需求:
st1 <- "LUVA TALCO AMIDO" st2 <- "LUVA REVESTIDAS AMIDO TALCO LUBRIFIC" st3 <- "LUVA REVESTIMENTO COM TALCO AMIDO " list_strings <- list(st1, st2, st3) lapply(list_strings, function(x) { if (grepl("REVEST\\w+", x)) { # 提取REVEST开头单词之后的所有内容 post_revest <- sub(".*REVEST\\w+\\s*", "", x) # 提取所有AMIDO/TALCO关键词 targets <- regmatches(post_revest, gregexpr("AMIDO|TALCO", post_revest))[[1]] # 拼接成要求的格式 new_suffix <- paste0("rev ", targets, ";", collapse = " ") # 替换原字符串中REVEST部分及后续内容 sub("REVEST\\w+.*", new_suffix, x) } else { x } })
输出结果
[[1]] [1] "LUVA TALCO AMIDO" [[2]] [1] "LUVA rev AMIDO; rev TALCO;" [[3]] [1] "LUVA rev TALCO; rev AMIDO;"
方法二:纯正则替换(单次逻辑遍历)
借助Perl正则的正向预查和全局替换,先清除无关内容再格式化目标词:
lapply(list_strings, function(x) { if (grepl("REVEST\\w+", x)) { # 移除REVEST开头单词和所有非目标关键词的内容 cleaned <- gsub("(REVEST\\w+)|\\b(?!AMIDO|TALCO)\\w+\\s*", "", x, perl = TRUE) # 将每个目标关键词替换为指定格式 gsub("\\b(AMIDO|TALCO)\\b", "rev \\1;", cleaned, perl = TRUE) } else { x } })
该方法同样能输出符合预期的结果。
内容的提问来源于stack exchange,提问作者Fabio Correa
相关产品推荐
相关产品推荐

