#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.] %