Использование регулярных выражений в R для обнаружения одного или двух повторяющихся символов в классе символов - PullRequest
2 голосов
/ 05 апреля 2020

Я хотел бы обнаружить один или несколько повторяющихся символов в классе символов, но не комбинацию уникальных символов в классе. В приведенном ниже примере мы ищем экземпляры p , t или k до r . Все три слова удовлетворяют приведенному ниже регулярному выражению, но я хотел бы исключить такие случаи, как be kt ri , где перед r у нас есть две разные согласные.

example <- c("betri", "bettri", "bektri")
str_detect(example, "[ptk]r")

То есть бетри и беттри - это хорошо, но бектри - это плохо. Любые советы?

Ответы [ 2 ]

1 голос
/ 05 апреля 2020

Как насчет этого?

library(stringr)
example <- c("betri", "bettri", "bektri")
str_detect(example, "([ptk])(\\1+)r|([^ptk])([ptk])r")
#> [1]  TRUE  TRUE FALSE

([ptk])\\1{1}r соответствует p, t или k два раза до r;
(\\1{1} соответствует одному символу из предыдущей группы - ([ptk]);
([^ptk])([ptk])r соответствует ap, t или k перед символом r, если ему не предшествует ap, t или k.

Вы также можете обобщить, чтобы включить любой согласный, который следует этому шаблону:

library(stringr)
example <- c("betri", "bettri", "bektri", "aepro", "aepo", "aeppro")
str_detect(example, "([[b-df-hj-np-tv-z]])(\\1+)r|([^[b-df-hj-np-tv-z]])([[b-df-hj-np-tv-z]])r")
#> [1]  TRUE  TRUE FALSE  TRUE FALSE  TRUE
1 голос
/ 05 апреля 2020

Вы можете использовать отрицательный вид сзади (?<!), чтобы исключить совпадения, когда вашим буквенным комбинациям предшествует k.

example <- c("betri", "bettri", "bektri")
str_detect(example, "(?<!k)[ptk]r")
[1]  TRUE  TRUE FALSE

Редактировать:
Я заметил, что неправильно прочитал ваше сообщение, и вам нужно исключить совпадения, когда у вас есть две разные согласные до r.

Тогда я бы использовал следующее регулярное выражение: (?<![^aeuioy])([^aeuioy])\\1?r. Он будет соответствовать любым одиночным или повторяющимся согласным до r, будь то в начале слова или в середине.

...