我有一个像这样的复杂字符串:
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 ...
我正在尝试以一种可靠的方式实现提取。
有什么想法吗?
答案 0 :(得分:0)
我们可以使用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指定的所有情况。
答案 1 :(得分:0)
您可以使用
regmatches(x, regexpr("Value\\s*:\\s*\\K-?\\d+(?:\\.\\d+)?", x, perl=TRUE))
详细信息
Value
-文字子字符串\s*:\s*
-用0+空格括起来的冒号\K
-匹配重置操作符,用于将所有匹配的文本丢弃到匹配内存缓冲区之外-?
-可选的减号\d+
-1个以上数字(?:\.\d+)?
-点和1+个数字的可选序列。答案 2 :(得分:0)