替换重复的字母例外

时间:2017-10-26 14:54:11

标签: r string gsub

我试图用一个字母替换任何重复的字母 我在这里使用gsub并且它正在工作:

text <- c("This tree is veeeeery tall")
gsub("([a-zA-Z])\\1+", "\\1", text)
##[1] "This tre is very tal"

但是我需要为某些单词设置例外:

"This tree is very tall"

我在这个问题Here中尝试了解决方案,但它没有用。

text <- c("This tree is veeeeery tall")
words2keep <- c("tree", "tall")
gsub(perl=T,paste0('(?!\\b',paste(collapse='\\b|\\b',words2keep),'\\b)\\b([a-zA-Z])\\1+\\b'),'\\1',text)
##[1] "This tree is veeeeery tall"

那么,有什么方法可以做到吗?

2 个答案:

答案 0 :(得分:2)

使用PCRE perl=TRUE选项,很容易为正则表达式引入异常。您只需要一个交替操作符,它将分隔两个主要部分:第一个,左侧,部分是我们匹配和跳过的内容,第二个是我们想要实际处理的内容。

\b(?:tree|tall)\b(*SKIP)(*F)|([a-zA-Z])\1+

请参阅regex demo

<强>详情

  • \b(?:tree|tall)\b(*SKIP)(*F) - 一个主要的单词边界,一个完整的单词treetall,一个尾随的单词边界,以及2个PCRE动词(*SKIP)(*F)的组合正则表达式引擎跳过匹配并继续从当前位置查找下一个(跳过的匹配结束)
  • | - 或
  • ([a-zA-Z])\1+ - 捕获到第1组中的任何ASCII字母,然后是同一个字母的一个或多个重复(请注意\p{L}带有(*UCP)动词使该模式完全支持Unicode <) / LI>

要在R中动态构建正则表达式,您需要将paste异常字向量放入正则表达式的左侧部分:

text <- c("This tree is veeeeery tall")
words2keep <- c("tree", "tall")
p <- paste0('\\b(?:',paste(collapse='|',words2keep),')\\b(*SKIP)(*F)|([A-Za-z])\\1+')
## OR: p <- paste0('(*UCP)\\b(?:',paste(collapse='|',words2keep),')\\b(*SKIP)(*F)|(\\p{L})\\1+')
p
## => [1] "\\b(?:tree|tall)\\b(*SKIP)(*F)|([A-Za-z])\\1+"
gsub(p, '\\1',text, perl=TRUE)
## => [1] "This tree is very tall"

请参阅R demo online

答案 1 :(得分:0)

以下是来自str_replace_all的{​​{1}}的解决方案:

stringr

此解决方案首先text1 <- c("This tree is veeeeery tall") text2 <- c("This tree is vaeeeeery tall") text3 <- c("This tree is eeeeery tall") words2keep <- c("tree", "tall") library(stringr) replace_func = function(string){ str_replace_all(string, "(\\w)\\1+", "\\1") } names(words2keep) = replace_func(words2keep) text_clean1 = replace_func(text1) str_replace_all(text_clean1, words2keep) # [1] "This tree is very tall" text_clean2 = replace_func(text2) str_replace_all(text_clean2, words2keep) # [1] "This tree is vaery tall" text_clean3 = replace_func(text3) str_replace_all(text_clean3, words2keep) # [1] "This tree is ery tall" 运行words2keep str_replace_all textwords2keep将使> words2keep tre tal "tree" "tall" 的名称成为str_replace_all

text

然后将同一> replace_func(text1) [1] "This tre is very tal" 应用于str_replace_all以删除所有重复的字词:

words2keep

最后,诀窍是让第三个pattern="[a-zA-Z\s]+"通过提供名为 syncExec向量的来用原始单词替换错误修改的单词。