正则表达式,用于提取数字模式

时间:2019-04-18 16:05:41

标签: r regex regex-lookarounds regex-group regex-greedy

我有一个像这样的复杂字符串:

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 ...

我正在尝试以一种可靠的方式实现提取。

有什么想法吗?

3 个答案:

答案 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))

请参见regex demoR online demo

详细信息

  • Value-文字子字符串
  • \s*:\s*-用0+空格括起来的冒号
  • \K-匹配重置操作符,用于将所有匹配的文本丢弃到匹配内存缓冲区之外
  • -?-可选的减号
  • \d+-1个以上数字
  • (?:\.\d+)?-点和1+个数字的可选序列。

答案 2 :(得分:0)

不确定this RegEx是否能涵盖您所有可能的输入内容:

[0-9\s\.]+%

enter image description here