#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" ""