Как извлечь повторяющиеся символы в R

#r #regex

#r #регулярное выражение

Вопрос:

Я пытаюсь извлечь те фонемы, которые повторяются в словах. У меня есть фонематические транскрипции таких слов, как эти:

 x <- c("saɪəns", "ɪvɒlvd", "ˌʌndəstænd", "skɑːb(ə)rə", "pəteɪtəʊ", "dɪskraɪbd")
 

Используя gsub и обратную ссылку, я могу это сделать:

 gsub(".*(.).*\1.*", "\1", x, perl = T)
[1] "s" "v" "d" "ə" "t" "ɪ"
 

Однако результат является неполным, поскольку выводится только одна повторяющаяся буква; полный результат будет:

 [1] "s" "v" "nd" "ə" "ət" "dɪ"
 

Я пробовал это с несколькими обратными ссылками, но это выводит целые строки:

 gsub(".*(.).*\1.*(.).*\2", "\1\2", x, perl = TRUE)
[1] "saɪəns"     "ɪvɒlvd"     "ˌʌndəstænd" "skɑːb(ə)rə" "pəteɪtəʊ"   "dɪskraɪbd"
 

Кто-нибудь может помочь?

Ответ №1:

Вы можете использовать

 library(stringr)
x <- c("saɪəns", "ɪvɒlvd", "ˌʌndəstænd", "skɑːb(ə)rə", "pəteɪtəʊ", "dɪskraɪbdɪ")
sapply(str_extract_all(x, "(.)(?=.*\1)"), function(z) paste(unique(z), collapse=""))
# => [1] "s"  "v"  "nd" "ə"  "ət" "dɪ"
 

Посмотрите онлайн-демонстрацию R.

Регулярное (.)(?=.*1) выражение находит все символы, за которыми следуют любые нулевые или более символов, отличных от символов разрыва строки, как можно больше, пока не появится тот же символ. stringr::str_extract_all Извлекает все вхождения (таким образом, общее количество одного и того же символа равно n-1). Поскольку это приводит к дублированию, uniq функция должна применяться к каждому символьному вектору при collapse вводе.

Ответ №2:

табулировать частоту букв и возвращать те, которые появляются более одного раза?

 sapply(strsplit(x, ''), function(s){ f <- table(s); paste0(names(f[f>1]), collapse = '') })
# [1] "s"  "v"  "dn" "ə"  "ət" "dɪ"
 

В случае отсутствия повторяющихся символов будет возвращена пустая строка:

 x <- c('abb', 'ab')
sapply(strsplit(x, ''), function(s){ f <- table(s); paste0(names(f[f>1]), collapse = '') })
# [1] "b" ""