我试图用一个字母替换任何重复的字母
我在这里使用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"
那么,有什么方法可以做到吗?
答案 0 :(得分:2)
使用PCRE perl=TRUE
选项,很容易为正则表达式引入异常。您只需要一个交替操作符,它将分隔两个主要部分:第一个,左侧,部分是我们匹配和跳过的内容,第二个是我们想要实际处理的内容。
\b(?:tree|tall)\b(*SKIP)(*F)|([a-zA-Z])\1+
请参阅regex demo
<强>详情
\b(?:tree|tall)\b(*SKIP)(*F)
- 一个主要的单词边界,一个完整的单词tree
或tall
,一个尾随的单词边界,以及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"
答案 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
text
,words2keep
将使> 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
向量的来用原始单词替换错误修改的单词。