R Как найти образец строки и извлечь произвольную длину символов из этого места? - PullRequest
0 голосов
/ 28 апреля 2019

Я хочу извлечь шаблон, а затем произвольное количество символов слева или справа от этого шаблона.Я считаю, что это возможно с Regex, но не знаю, как поступить.Ниже приведен пример данных и выходных данных, которые я ищу:

library(data.table)
#my data set
df = data.table(
  event = c(1,2,3),
  notes = c("watch this movie from 4-7pm",
            "watch this musical from 5-9pm",
            "eat breakfast at this place from 7-9am")

)

#how do I point R to a string section and then pull characters around it?

#example:
grepl('pm|am',df$notes) # I can see an index that these keywords exist but how can I tell R
#locate that word and then maybe pull N digits to the left, or n digits to right like substr()

#output would be 
#'4-7pm', '5-9pm', '7-9am'

#right now I can extract the pattern:
library(stringr)
str_extract(df$notes, "pm")
#but I also want to then pull things to the left or right of it.

Ответы [ 2 ]

2 голосов
/ 28 апреля 2019

В вашем случае может работать только следующее:

sapply(df$notes, function(x) {
  grep("am|pm", unlist(strsplit(x, " ")), value = T)
}, USE.NAMES = FALSE)
[1] "4-7pm" "5-9pm" "7-9am"

Тем не менее, это все еще может не сработать из-за крайних случаев. Вы также можете попробовать регулярные выражения, чтобы извлечь все работы, заканчивающиеся на am или pm

Посмотрите на stringr, чтобы найти извлекаемые символы и построить радиус:

 stringr::str_locate(df$notes, "am|pm")
     start end
[1,]    26  27
[2,]    28  29
[3,]    37  38
0 голосов
/ 28 апреля 2019

Используя stringr, вы можете сделать что-то подобное.С матрицей местоположений вы можете передвигаться по радиусу для всего, что вы ищете:

library(stringr)

# Extacting locations
locations <- str_locate(df$notes, "\\d+\\-\\d+pm|\\d+\\-\\d+am")

# Using substring to pull the info you want
str_sub(df$notes, locations)

[1] "12-7pm" "5-9pm"  "7-9am"

Данные (я поменял 4 на 12):

df = data.table(
  event = c(1,2,3),
  notes = c("watch this movie from 12-7pm",
            "watch this musical from 5-9pm",
            "eat breakfast at this place from 7-9am")

)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...