gsub - сводит все повторяющиеся символы к одному экземпляру - PullRequest
3 голосов
/ 05 марта 2012

Немного странный вопрос для всех вас - я решил проблему с желанием заменить все повторяющиеся символы в строке, но я не совсем понимаю свое решение.Пример:

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

Соответствует ли это просто всем повторяющимся экземплярам каждой буквы (поисковый термин + повторы поискового запроса) и заменяет их искомой буквой?Или это делает что-то непреднамеренное, что я полностью не понимаю?

Ответы [ 2 ]

7 голосов
/ 05 марта 2012

Вы объявили одну группу - любой символ от a до z.\\1 ссылается на эту группу.Любое количество повторений этой группы подставляется в значение группы.Например, если группа - a, то любое число a с будет заменено значением группы, например, a.

Надеюсь, я все прояснил =)

0 голосов
/ 09 мая 2017

Если вы хотите заменить буквы, которые появляются по крайней мере 3 раза (например), вот мое решение (используйте {2,}:

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

Как вы можете видеть, 4 "а" былиуменьшено до 1 a, 3 r уменьшено до 1 r, но значения 2 n и 2 e не изменились. Как указано выше, вы можете заменить [[: alpha:]] любой комбинацией [a-zA-KM-Z] или аналогичный, и даже используйте оператор "или" | в квадратных скобках [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 раз на один и тот же символ, затем используйте {n-1,}. Если вы хотите заменить эти n-повторения только 2 раз (например)этот символ, используйте "\\1\\1" в качестве замены.

...