#r #regex #filtering
#r #регулярное выражение #фильтрация
Вопрос:
Мне нужна поддержка с фильтрацией регулярных выражений!
У меня есть список ключевых слов и много строк, которые следует проверить. В этом примере ключевое слово «-book-» может быть (1) в середине предложения или (2) в конце, что означало бы, что последний дефис отсутствует.
Мне нужно регулярное выражение, которое идентифицирует «-book-» и «-book». Я не хочу, чтобы были идентифицированы похожие ключевые слова, такие как «-booking-» и т.д.
library(dplyr)
keywords = c( "-album-", "-book-", "-castle-")
search_terms = paste(keywords, collapse ="|")
number = c(1:5)
sentences = c("the-best-album-in-shop", "this-book-is-fantastic", "that-is-the-best-book", "spacespacespace", "unwanted-sentence-with-booking")
data = data.frame(number, sentences)
output = data %>% filter(., grepl( search_terms, sentences) )
# Current output:
number sentences
1 1 the-best-album-in-shop
2 2 this-book-is-fantastic
# DESIRED output:
number sentences
1 1 the-best-album-in-shop
2 2 this-book-is-fantastic
3 3 that-is-the-best-book
Комментарии:
1. Удалить
"-book-"
, добавить"\bbook-", "-book\b"
кsearch_terms
2. Спасибо, что сработало для этого небольшого примера.. Но в моем полном списке с ключевыми словами это выдавало ошибки. Ключевые слова, начинающиеся с «W» или «S», приводили к ошибкам, поскольку \W — это команда для символов, не являющихся словами, а также \S.
Ответ №1:
Вы также могли бы сделать:
subset(data, grepl(paste0(sprintf("%s?\b",keywords),collapse = "|"), sentences))
number sentences
1 1 the-best-album-in-shop
2 2 this-book-is-fantastic
3 3 that-is-the-best-book
Обратите внимание, что при этом будет проверяться только -book-
в (1) середине предложения или (2) в конце, но не в начале
Ответ №2:
-book-
Шаблон будет соответствовать целому слову book
с дефисом слева и справа.
Чтобы сопоставить целое слово book
с дефисом слева или справа, вам нужно чередование bbook-|-bookb
.
Таким образом, вы можете использовать
keywords = c( "-album-", "\bbook-", "-book\b", "-castle-" )
Ответ №3:
Другое решение, которое вы можете принять во внимание
library(stringr)
data %>%
filter(str_detect(sentences, regex("-castle-|-album-|-book$|-book-\w{1,}")))
# number sentences
# 1 1 the-best-album-in-shop
# 2 2 this-book-is-fantastic
# 3 3 that-is-the-best-book