Как насчет этого?
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