22

我想实现一个R删除字符串中重复字符的函数。例如,假设我的函数名为removeRS,所以它应该以这种方式工作:

  removeRS('Buenaaaaaaaaa Suerrrrte')
  Buena Suerte
  removeRS('Hoy estoy tristeeeeeee')
  Hoy estoy triste

我的函数将与用西班牙语编写的字符串一起使用,因此查找具有三个以上连续元音的单词并不常见(或至少正确)。不用担心他们背后可能存在的情绪。尽管如此,有些单词可以有两个连续的辅音(尤其是 ll 和 rr),但我们可以从函数中跳过它。

所以,总而言之,这个函数应该用那个字母替换连续出现至少 3 次的字母。在上述示例之一中,aaaaaaaaa替换为a

你能给我任何提示来完成这项任务R吗?

4

3 回答 3

37

我没有仔细考虑这一点,但这是我在正则表达式中使用引用的快速解决方案:

gsub('([[:alpha:]])\\1+', '\\1', 'Buenaaaaaaaaa Suerrrrte')
# [1] "Buena Suerte"

()首先捕获一个字母,\\1指该字母,+表示匹配一次或多次;将所有这些部分放在一起,我们可以匹配一个字母两次或更多次。

要包含除字母数字以外的其他字符,请替换[[:alpha:]]为匹配您希望包含的任何内容的正则表达式。

于 2012-06-22T23:59:50.047 回答
7

我认为您应该注意问题描述中的歧义。这是第一次尝试,但它显然不能以您想要的方式与“Good Luck”一起使用:

removeRS <- function(str) paste(rle(strsplit(str, "")[[1]])$values, collapse="")
removeRS('Buenaaaaaaaaa Suerrrrte')
#[1] "Buena Suerte"
于 2012-06-22T22:52:38.147 回答
2

由于您要替换至少出现 3 次的字母,因此这是我的解决方案:

gsub("([[:alpha:]])\\1{2,}", "\\1", "Buennaaaa Suerrrtee")
#[1] "Buenna Suertee"

如您所见,4 "a" 已缩减为仅 1 a,3 r 已缩减为 1 r,但 2 n 和 2 e 未更改。如上所述,您可以将 替换为[[:alpha:]]任何组合或类似的组合,如果您希望代码仅影响 y 和 Q 的重复,[a-zA-KM-Z]甚至可以在|方括号内使用“或”运算符。[y|Q]

gsub("([a|e])\\1{2,}", "\\1", "Buennaaaa Suerrrtee")
# [1] "Buenna Suerrrtee"
# triple r are not affected and there are no triple e.
于 2017-05-09T03:54:33.197 回答