извлечь число после определенной строки

Мне нужно найти число после строки «Количество». Между строкой «Количество» и числом может быть пробел или символ. У меня есть что-то, что работает на www.regex101.com, но не работает с функцией stringr str_extract.

library(stringr)

shopping_list <- c("apples x4", "bag of flour", "bag of sugar", "milk x2", "monkey coconut 3oz count of 5", "monkey coconut count of 50", "chicken Count Of-10")
str_extract(shopping_list, "count of ([\\d]+)")
[1] NA NA NA NA "count of 5" "count of 50" NA

Что я хочу получить:

[1] NA NA NA NA "5" "50" "10"

person Matthew Crews    schedule 11.03.2016    source источник


Ответы (3)


str_extract(shopping_list, "(?i)(?<=count of\\D)\\d+")
# [1] NA   NA   NA   NA   "5"  "50" "10"

где (?i) делает шаблон нечувствительным к регистру, \\D означает, что не является числом, а ?<= является положительным просмотром назад.

person Julius Vainora    schedule 11.03.2016
comment
Я думал о ретроспективном анализе, но если данные немного отличаются, это не удастся. Попробуйте "coconut count of - 5" - person Pierre L; 11.03.2016
comment
@PierreLafortune, правда, но в данном случае я понимаю, что между f и числом может быть только один символ. - person Julius Vainora; 11.03.2016
comment
Это запрос, который предоставляет значение, которое мне нужно, используя только регулярное выражение. Благодарю вас! - person Matthew Crews; 11.03.2016
comment
@Julius Джулиус, возможно ли сделать \\D любое количество нечисловых, несимвольных переменных? - person Matthew Crews; 11.03.2016
comment
@MatthewCrews, к сожалению, насколько мне известно, положительный взгляд назад допускает только текст предопределенной длины, так что нет (если мы хотим сохранить тот же дух, что и в этом ответе). Именно это имел в виду Пьер Лафортун в своем комментарии. - person Julius Vainora; 11.03.2016
comment
@Julius, спасибо за информацию. Причина, по которой я не принял ответ Пьера, заключалась в том, что он возвращал текст из каждого элемента вектора, а затем зависел от функции as.numeric для исключения элементов, которые не представляли интереса. Этот ответ фактически извлекает интересующий элемент, используя только RegEx. - person Matthew Crews; 11.03.2016

Смотреть вперед и смотреть назад - это то, что вы ищете с помощью этой группы ...

shopping_list <- c("apples x4", "bag of flour", "bag of sugar", "milk x2", "monkey coconut 3oz count of 5", "monkey coconut count of 50", "chicken Count Of-10")
str_extract(shopping_list, "(?<=count of )[0-9]*")
[1] NA   NA   NA   NA   "5"  "50" NA  
person cory    schedule 11.03.2016

as.numeric(sub("(?i).*count of.*?(\\d+).*", "\\1", shopping_list))
[1] NA NA NA NA  5 50 10

Шаблон регулярного выражения:

  • (?i): Игнорировать регистр
  • .*count of.*?: Любая длина символов до "количества"
  • (\\d+): Захват одной или нескольких цифр
  • "\\1": вернуть группу захвата

На данный момент другие ответы не будут работать с чем-то вроде ""coconut count of - 5", поскольку они ограничены одним пробелом после «счетчика».

person Pierre L    schedule 11.03.2016