Поскольку вы хотите извлекать с помощью регулярных выражений, вы можете использовать gregexpr
и regmatches
.
( nospaces <- gsub("\\s", "", sentense) )
# [1] "Ireallylikemexicana" "wanttoeatmacdonaldsomuch!" "IhateKFC"
re <- gregexpr(paste(r_list, collapse = "|"), nospaces)
regmatches(nospaces, re)
# [[1]]
# [1] "mexicana"
# [[2]]
# [1] "macdonald"
# [[3]]
# [1] "KFC"
Таким образом, возвращаемое значение из gregexpr
представляет собой список с атрибутами:
str(re)
# List of 3
# $ : int 12
# ..- attr(*, "match.length")= int 8
# ..- attr(*, "index.type")= chr "chars"
# ..- attr(*, "useBytes")= logi TRUE
# $ : int 10
# ..- attr(*, "match.length")= int 9
# ..- attr(*, "index.type")= chr "chars"
# ..- attr(*, "useBytes")= logi TRUE
# $ : int 6
# ..- attr(*, "match.length")= int 3
# ..- attr(*, "index.type")= chr "chars"
# ..- attr(*, "useBytes")= logi TRUE
В списке первый элемент [[1]]
предназначен для первой строки "Ireallylikemexicana"
и т. Д. В этом списке 12 означает, что было совпадение, начиная с 12-го символа, и его длина составляла 8 символов.Повторите для остальных.
Это будет сопоставлять и извлекать несколько совпадений в одной строке.
others <- c("quuxmexicanaoKFCmmmsdkfj", "quux")
str(re <- gregexpr(paste(r_list, collapse = "|"), others))
# List of 2
# $ : int [1:2] 5 14
# ..- attr(*, "match.length")= int [1:2] 8 3
# ..- attr(*, "index.type")= chr "chars"
# ..- attr(*, "useBytes")= logi TRUE
# $ : int -1
# ..- attr(*, "match.length")= int -1
# ..- attr(*, "index.type")= chr "chars"
# ..- attr(*, "useBytes")= logi TRUE
str(regmatches(others, re))
# List of 2
# $ : chr [1:2] "mexicana" "KFC"
# $ : chr(0)
В этом случае второй элемент списка (для "quux"
) равен -1,то есть совпадение не найдено.Это приводит к пустому (character(0)
) заполнителю во второй позиции списка.В этом случае вы можете получить все совпадения независимо от того, какая строка , используя unlist
.