Р: Как извлечь подстроку до и после определенной ключевой фразы? - PullRequest
1 голос
/ 18 октября 2019

Я пытаюсь разбить длинную строку на несколько факторов, которые встречаются до и после ключевых фраз. Я могу частично разбить его на первый случай, но не для каждого из них. Кроме того, ни один из предыдущих вопросов, касающихся сопоставления с образцом, не смог ответить на этот вопрос для меня.

Пример строки текста:

"#1 Player A advances to third on a wild pitch. #2 Player B advances to second on an error."

Частичное решение:

gsub('((advances).*$)', '', "#1 Player A advances to third on a wild pitch. #2 Player B advances to second on an error.", ("[\\w]*) advances"))

Это возвращает:

"#1 Player A "

Тем не менее, я хотел бы:

[1] "#1 Player A advances to third" [2] "#2 Player B advances to second"

как две отдельные строки вывода.

Я не знаю методов для извлечения текстамежду фразой «продвигается к ...» и номером игрока.

Заранее спасибо!

Ответы [ 2 ]

2 голосов
/ 18 октября 2019

Если мы предположим, что интересная часть всегда начинается с # и заканчивается одним словом после advances to, то мы можем сделать:

s <- "#1 Player A advances to third on a wild pitch. #2 Player B advances to second on an error."
regmatches(s, gregexpr("#[[:alnum:] ]+ advances to \\w+", s))
# [[1]]
# [1] "#1 Player A advances to third"  "#2 Player B advances to second"

(Одна из причин, по которой я предпочитаю более многословное использованиеиз gregexpr и regmatches означает, что он не возвращает «что-то», когда «ничего» не совпадает, в отличие от gsub, если регулярное выражение не было тщательно обработано.)

2 голосов
/ 18 октября 2019

Всегда есть слово после числа? Если это так, это будет работать:

library(stringr)

str_match_all(str1, "(#.*? to \\S+)")[[1]][, 2]
# [1] "#1 Player A advances to third"  "#2 Player B advances to second"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...