如何用R删除字符串中重复的字符?

时间:2012-06-22 21:56:53

标签: string r

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

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

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

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

您可以使用R向我提供任何提示来执行此任务吗?

3 个答案:

答案 0 :(得分:31)

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

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

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

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

答案 1 :(得分:7)

我认为您应该注意问题描述中的含糊之处。这是第一次尝试,但它显然不能以你想要的方式与“好运”合作:

removeRS <- function(str) paste(rle(strsplit(str, "")[[1]])$values, collapse="")
removeRS('Buenaaaaaaaaa Suerrrrte')
#[1] "Buena Suerte"

答案 2 :(得分:1)

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

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

你可以看到4&#34; a&#34;已经减少到只有1 a,3 r已减少到1 r但2 n和2 e没有改变。 如上所述,您可以使用[[:alpha:]]或类似的任意组合替换[a-zA-KM-Z],甚至可以使用&#34;或&#34;如果您希望代码仅影响y和Q的重复,则在方括号|内的运算符[y|Q]

gsub("([a|e])\\1{2,}", "\\1", "Buennaaaa Suerrrtee")
# [1] "Buenna Suerrrtee"
# triple r are not affected and there are no triple e.
相关问题