R语言如何使用正则表达式从字符串不同位置移除指定单词remove
R语言移除向量中指定单词的正则实现
问题背景
需要从如下R字符向量中,统一移除独立单词remove,最终保留规范的逗号分隔格式,不残留多余的逗号、空格:
# 原始输入向量 x <- c('something,remove', 'remove, something', 'something, remove, somethingElse,alsoThis')
预期处理结果:
[1] "something" "something" "something, somethingElse, alsoThis"
已有基于strsplit的拆分拼接实现可满足需求,现需要更直接的正则表达式实现方案。
原有strsplit实现参考:
sapply(strsplit(x, ', |,'), function(i)paste(i[i != 'remove'], collapse = ', '))
正则实现方案
直接用基础R的gsub()函数即可完成,不需要额外加载第三方包,核心是匹配remove在字符串开头、中间、结尾三种位置的场景,连带绑定的逗号、多余空格一起移除,最后统一修正逗号后的空格格式即可:
# 第一步:移除所有位置的独立单词remove及相邻冗余分隔符 temp <- gsub( pattern = "^remove,\\s*|,\\s*remove$|,\\s*remove\\s*(?=,)", replacement = "", x = x, perl = TRUE ) # 第二步:统一逗号后空格格式,匹配逗号后无空格的位置补空格 result <- gsub(",(?!\\s)", ", ", temp, perl = TRUE)
运行后输出结果完全匹配预期:
> result [1] "something" "something" [3] "something, somethingElse, alsoThis"
正则规则说明
^remove,\\s*:匹配出现在字符串最开头的remove,结构,后面允许跟0个或多个空格,匹配到的内容直接删除,\\s*remove$:匹配出现在字符串最末尾的,remove结构,remove前面允许有0个或多个空格,匹配到的内容直接删除,\\s*remove\\s*(?=,):匹配夹在两个逗号中间的remove,前后允许有任意数量空格,用正向预查(?=,)保留后面的逗号,避免出现连续逗号的问题,(?!\\s):匹配逗号后面没有空格的位置,替换为,,统一分隔格式,同时不会影响已经正确加了空格的位置
注意:正则里加了位置匹配逻辑,只会匹配独立的
remove单词,不会误删其他包含remove字符的长单词(比如remover、removeThis这类词不会被改动)。
内容的提问来源于stack exchange,提问作者Sotos
相关产品推荐
相关产品推荐

