Регулярное выражение — фильтр с (1) дефисом или (2) концом предложения

#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