Регулярное выражение для извлечения числовых шаблонов

#r #regex #regex-lookarounds #regex-group #regex-greedy

#r #регулярное выражение #регулярное выражение -поиск #регулярное выражение-группа #регулярное выражение-жадное

Вопрос:

Я получил сложную строку, подобную этой:

 x <- "Lab ID : 11.11111 4\nStatus : Final(F)\nValue : 0.4 %\nLow range:  0\nHigh range:  2\n"
 

Значение 0.4 — это то, что интересно, поэтому всегда числовой шаблон сразу после Value :

До сих пор я пробовал следующее:

 y <- gsub(".*Value : \s*|\\.*", "", x)
 

За которым следует :

 gsub("[^0-9\.-][^\s] ", "", y)
 

Проблема заключается в том, что числовой шаблон может принимать любое положительное или отрицательное значение, и иногда за ним следуют другие числовые шаблоны (например 0.4 10E9/ml ). Более того, это осложняется тем фактом, что Value : за ним также могут следовать символьные значения (например Value : pending \nLow ...

Я пытаюсь добиться извлечения в одну строку надежным способом.

Есть идеи?

Комментарии:

1. Можете ли вы предоставить больше входных данных?

Ответ №1:

Мы можем использовать sub для сопоставления всей строки и замены шаблоном, который соответствует значению цифры:

 x <- "Lab ID : 11.11111 4\nStatus : Final(F)\nValue : pending -0.4 10E9/ml %\nLow range:  0\nHigh range:  2\n"

sub(".*Value\s*:[\s[:alpha:]]*(-?\d \.\d ).*", "\1", x, perl = TRUE)
# [1] "-0.4"
 

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

Ответ №2:

Вы можете использовать

 regmatches(x, regexpr("Value\s*:\s*\K-?\d (?:\.\d )?", x, perl=TRUE))
 

Смотрите демонстрацию регулярных выражений и онлайн-демонстрацию R.

Подробные сведения

  • Value — литеральная подстрока
  • s*:s* — двоеточие, заключенное в 0 пробелов
  • K — оператор сброса соответствия, который удаляет весь текст, сопоставленный до сих пор, из буфера памяти соответствия
  • -? — необязательный минус
  • d — 1 цифр
  • (?:.d )? — необязательная последовательность из точки и 1 цифр.

Ответ №3:

Не уверен, что это регулярное выражение будет охватывать все ваши возможные входные данные:

 [0-9s.] %
 

введите описание изображения здесь