2012-03-05 50 views
3

对于你们所有人来说都有点奇怪的问题 - 我已经解决了希望替换字符串中所有重复字符的问题,但我并不真正理解我的解决方案。实例是:gsub - 将所有重复字符减少为一个实例

txt <- "haarbbbbbbijjjjjan" 
gsub("([a-z])\\1+", "\\1", txt) 
[1] "harbijan" 

这只是匹配每个字母的所有重复实例(Search搜索词句的长期重复+),并与搜索字母代替他们呢?或者这是在做一些我无法完全理解的意外事件?

回答

7

您已声明一个组 - az之间的任何符号。 \\1引用此组。该组的任何重复次数都被代入组值。例如,如果组为a,则任何数量的a将被组值替换,例如,与a

希望我自己清楚=)

+0

谢谢 - 解释非常方便! – thelatemail 2012-03-05 06:42:03

+0

@Andrew Logninov,如果您想要替换连续出现两次以上重新排列的字母,这种情况会有何变化。例如,我想用''r''替换''rrr',但保持''rr''不变?谢谢。 – Nestorghh 2012-06-27 19:57:41

+0

@Nestorghh我不知道你在用什么语言,但总的来说,这应该看起来像这样:'substitute('r {3,}','r',)''。 – 2012-06-27 20:13:20

0

如果要更换至少出现3次(例如字母),这里是我的解决方案(使用{2,}

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

,你可以看到4“a”已经减少到只有1 a,3 r已经减少到1 r,但2 n和2 e没有改变。如上所示,你可以替换[[:alpha:]]通过[a-zA-KM-Z]或类似的任意组合,甚至在squre括号[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. 

如果你想更换相同的字符至少ň次的重复,然后使用{n-1,}。 如果您想要替换该重复次数仅为(例如)该字符,请在替换中使用"\\1\\1"