@ GraemeForst Обобщение может быть достигнуто с помощью группирования и просмотра:
group <- "[\\^\\_\\<\\>3\\:\\(\\)\\;]"
pat <- sprintf(".*[\\s\\b](%s+)(?!\\1)", group)
group
определяет группировку символов. В основном все символы, которые мы хотим извлечь.
pat
определяет наш соответствующий шаблон. [\\s\\b]
говорит, что перед возможным совпадением должен быть либо пробел, либо граница. И (?!\\1)
говорят, что после матча не может быть элемента group
.
Вот демоверсия:
X <- c("amazing tiny phone ^_^","so cute!!! <3", "I like pizza :)", "hello beautiful ;)")
gsub(pat, "\\1", grep(pat, X, value = TRUE, perl = TRUE), perl = TRUE)
# [1] "^_^" "<3" ":)" ";)"
Это может быть уточнено и обобщено. Очень простой шаг, который можно добавить, - это расширение grouping
.
.
Старый ответ
Вы можете использовать регулярные выражения для этого:
# create the pattern to be extracted
pat = ".*(\\^\\_\\^).*|.*(\\<3).*" # escape special characters with "\\" and ".*" to specify there may be text before/after
# extract
gsub(pat, "\\1\\2", grep(pat, X, value = TRUE, perl = TRUE), perl = TRUE)
# [1] "^_^" "<3"