gsub - 将所有重复字符减少到一个实例

时间:2012-03-05 06:33:54

标签: regex r gsub

对你们一个有点奇怪的问题 - 我已经解决了我希望替换字符串中所有重复字符的问题,但我并不理解我的解决方案。例如:

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

这只是匹配每个字母的所有重复实例(搜索字词+搜索字词的重复)并将其替换为搜索到的字母吗?或者这是否是我无法完全掌握的无意识的事情?

2 个答案:

答案 0 :(得分:7)

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

希望我明白自己=)

答案 1 :(得分: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未被更改。如上所述,你可以用[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.

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

相关问题