Что не так в моем регулярном выражении, чтобы извлечь партии строки в R? - PullRequest
1 голос
/ 14 марта 2019

Во фрейме данных есть строка, подобная этой:

df <- data.frame (Product = c("Chocolate Some_brand 200g 180ml PKG",
                              "Strawberry Grown_locally 380g"))

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

df %>% mutate(
   volume = str_extract(Product, '\\d+ml|\\d+ ml')
)
# the return is:
# 180ml
# NA

Пытаясь вернуть sabe, но без строки ml, я пытаюсь что-то вроде этого:

df %>% mutate(
   volume = str_extract(NombreProducto, '\\d+[^ml]|\\d+[^ ml]')
)
# the return is:
# 180
# 380g

Что мне сделать, чтобы получить эти результаты?

# 180
# NA

1 Ответ

3 голосов
/ 14 марта 2019

Вы можете использовать (?=\s*ml) lookahead:

str_extract(df$Product, '\\d+(?=\\s*ml)')
## => [1] "180" NA 

Обратите внимание, что вы можете убедиться, что ml соответствует целому слову, добавив \b границы слова после него, и вы можете поддержать значения с плавающей запятой, заменив \d на \d*\.?\d+ (или \d+(?:[,.]\d+)?): * * 1010

str_extract(df$Product, '\\d*\\.?\\d+(?=\\s*ml\\b)')

Детали шаблона

  • \d+ - 1 или более цифр
  • (?=\s*ml) - положительный прогноз, требующий 0 или более пробелов, а затем ml непосредственно справа от текущего местоположения, но не добавляющий сопоставленный текст к общему значению соответствия, поскольку шаблоны прогнозирования не потребляют.
...