Вытащить числа перед фразой - PullRequest
0 голосов
/ 15 января 2019

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

[1] "collected 1 hr total. wind >15 mph."   "collected 4 hr total. 
wind ~15 mph."  
[3] "collected 10 hr total. gusts 5-10 mph." "collected 1 hr total. 
breeze at 1mph," 
[5] "collected 2 hrs."    [6]

Я хочу:

 [1] > 15 mph
 [2] ~15 mph
 [3] 5-10 mph
 [4] 1mph
 [5] 
 [6]

И я хочу вывести скорость ветра в каждом ряду. Можете ли вы предложить правильное выражение регулярного выражения? Как вы видете, а) между цифрами может быть переменное количество пробелов & "mph" б) цифры перед mph могут иметь разные символы: «>», «<», «~» или могут быть интервалом «-» </p>

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

Ответы [ 2 ]

0 голосов
/ 15 января 2019

Один вариант с str_extract

library(stringr)
trimws(str_extract(v1, "[>~]?[0-9- ]+mph"))
#[1] ">15 mph"   "~15 mph"   "5-10 mph" "1mph"     NA     

данными

v1 <- c("collected 1 hr total. wind >15 mph.", 
   "collected 4 hr total. wind ~15 mph.", 
 "collected 10 hr total. gusts 5-10 mph.", 
 "collected 1 hr total. breeze at 1mph,", 
  "collected 2 hrs.")
0 голосов
/ 15 января 2019

Если предположить, что каждая строка имеет не более одного совпадающего члена, то мы можем попытаться использовать sapply вместе с sub:

input <- c("collected 1 hr total. wind >15 mph.",
           "collected 4 hr total. wind ~15 mph.",
           "collected 10 hr total. gusts 5-10 mph.",
           "collected 1 hr total. breeze at 1mph,",
           "collected 2 hrs.")

matches <- sapply(input, function(x) {
    ifelse(grepl("[>~0-9-]+\\s*mph", x),
           sub(".*?([>~0-9-]+\\s*mph).*", "\\1", x),
           "")})

names(matches) <- c(1:length(matches))
matches

         1          2          3          4          5 
 ">15 mph"  "~15 mph" "5-10 mph"     "1mph"         "" 
...