[英]How can I remove repeated characters in a string with R?
我想用R
实现一个删除字符串中重复字符的函数。 例如,假设我的函数名为removeRS
,因此它应该以这种方式工作:
removeRS('Buenaaaaaaaaa Suerrrrte')
Buena Suerte
removeRS('Hoy estoy tristeeeeeee')
Hoy estoy triste
我的函数将用于用西班牙语编写的字符串,因此找到具有三个以上连续元音的单词并不常见(或至少是正确的)。 不用担心他们背后可能存在的情绪。 尽管如此,有些单词可以有两个连续的辅音(特别是ll和rr),但我们可以从我们的函数中跳过这个。
因此,总而言之,此函数应该替换仅与该字母连续出现至少三次的字母。 在以上的实施例之一, aaaaaaaaa
被替换为a
。
你可以给我任何提示用R
执行这项任务吗?
我没有仔细考虑过这个,但这是我在正则表达式中使用引用的快速解决方案:
gsub('([[:alpha:]])\\1+', '\\1', 'Buenaaaaaaaaa Suerrrrte')
# [1] "Buena Suerte"
()
首先捕获一个字母, \\\\1
表示该字母, +
表示匹配一次或多个字母; 把所有这些碎片放在一起,我们可以匹配一个字母两次或更多次。
要包括除字母数字之外的其他字符,请将[[:alpha:]]
替换为匹配任何内容的正则表达式。
我认为你应该注意问题描述中的含糊之处。 这是第一次尝试,但它显然不能以你想要的方式与“好运”一起工作:
removeRS <- function(str) paste(rle(strsplit(str, "")[[1]])$values, collapse="")
removeRS('Buenaaaaaaaaa Suerrrrte')
#[1] "Buena Suerte"
由于您要替换至少出现3次的字母,这是我的解决方案:
gsub("([[:alpha:]])\\1{2,}", "\\1", "Buennaaaa Suerrrtee")
#[1] "Buenna Suertee"
正如您所看到的,4“a”已减少到仅1 a,3 r已减少到1 r,但2 n和2 e未被更改。 如上所述,你可以用[a-zA-KM-Z]
或类似的任意组合替换[[:alpha:]]
,甚至可以使用“或”运算符|
如果希望代码只影响y和Q的重复,则在squre括号内[y|Q]
。
gsub("([a|e])\\1{2,}", "\\1", "Buennaaaa Suerrrtee")
# [1] "Buenna Suerrrtee"
# triple r are not affected and there are no triple e.
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.