У меня есть большая переменная, содержащая строки (слова). Мне нужно извлечь все подстроки, содержащие любые шаблоны, перечисленные в отдельном векторе.
library(tidyverse)
df <- data.frame(Word = c("hope", "freeze", "free"))
patterns <- "hope|freeze|free|du|li|un|de|em|bi|en|im|ro|gi|ai|ag|wo|ab|di|ac|eu|ic|se|al|ob|ig|es|ef|sy|ep|ec|y|u|e|o|a|h|i"
df %>%
mutate(simple = str_extract_all(Word, patterns))
Однако похоже, что функция возвращает наиболее полную строку в зависимости от порядка, в котором находятся patterns
. Так, например, если patterns
имеет порядок, показанный выше, результат будет:
Word simple
1 hope hope
2 freeze freeze
3 free free
Если порядок обратный (т.е. в порядке убывания длины:
patterns2 <-"y|u|e|o|a|h|i|du|li|un|de|em|bi|en|im|ro|gi|ai|ag|wo|ab|di|ac|eu|ic|se|al|ob|ig|es|ef|sy|ep|ec|hope|freeze|free"
df %>%
mutate(simple = str_extract_all(Word, patterns2))
Word simple
1 hope h, o, e
2 freeze freeze
3 free free
Есть ли способ получить все потенциальные шаблоны, независимо от их порядка? Вот желаемый результат:
Word simple
1 hope h, o, e, hope
2 freeze freeze
3 free free
Как и в связанной теме, не используйте одно регулярное выражение на основе |
, запускайте поиск каждой подстроки отдельно.
Вы можете разделить шаблон на вектор подшаблонов, а затем извлечь элементы, включенные в каждое слово.
pat_vec <- str_split_1(patterns, fixed('|'))
df %>%
mutate(simple = lapply(Word, \(x) pat_vec[str_which(x, pat_vec)]))
# Word simple
# 1 hope hope, e, o, h
# 2 freeze freeze, free, e
# 3 free free, e
Само по себе регулярное выражение в таком общем сценарии, как здесь, нельзя использовать для извлечения совпадений, имеющих одно и то же начальное местоположение.