从字符串中提取n-decimal

时间:2015-05-18 09:07:14

标签: regex r

我已经浏览了一半的stackoverflow来寻找这个,但似乎没有什么完全匹配,抱歉,如果错了。

我有一个格式为:

的字符串

fname <-'FS1_SCN0.83_axg3.csv'

我想提取第二个数字,恰好是小数,但也可以是一个整数,结果得到0.83(如果是整数则为3)。我得到的最近的是:

gsub("[^0-9.]","\\2",fname)

生成fname(10.833。)中的所有数字和小数点,但作为整个字符串。

提前致谢,p。

5 个答案:

答案 0 :(得分:3)

要获得第二个号码,

regmatches(x, regexpr("^\\D*\\d+\\D*\\K\\d+(?:\\.\\d+)?", x, perl=TRUE))

Demo

sub("^\\D*\\d+\\D*(\\d+(?:\\.\\d+)?).*", "\\1", x, perl=TRUE)

示例:

> x <-'FS1_SCN0.83_axg3.csv'
> regmatches(x, regexpr("^\\D*\\d+\\D*\\K\\d+(?:\\.\\d+)?", x, perl=TRUE))
[1] "0.83"
> sub("^\\D*\\d+\\D*(\\d+(?:\\.\\d+)?).*", "\\1", x, perl=TRUE)
[1] "0.83"

对于更一般的情况,

regmatches(x, regexpr("^\\D*\\d+(?:\\.\\d+)?\\D*\\K\\d+(?:\\.\\d+)?", x, perl=TRUE))
sub("^\\D*\\d+(?:\\.\\d+)?\\D*(\\d+(?:\\.\\d+)?).*", "\\1", x, perl=TRUE)

只需指定索引号即可获得所需的数字。

> regmatches(fname, gregexpr("\\d+(?:\\.\\d+)?", fname))[[1]][2]
[1] "0.83"

答案 1 :(得分:3)

正则表达式

.+_SCN(\d+(?:\.\d+)?)_.+\.csv

描述

Regular expression visualization

Demo

示例代码

sub(".+_SCN(\\d+(?:\\.\\d+)?)_.+\\.csv", "\\1", fname)

答案 2 :(得分:2)

^.*?(?:\\d+(?:\\.\\d+)?).*?\\K\\d+(?:\\.\\d+)?

您可以使用此perl=True选项并抓住匹配。请参阅演示。

https://www.regex101.com/r/fJ6cR4/8

gsub("^.*?(?:\\d+(?:\\.\\d+)?).*?(\\d+(?:\\.\\d+)?).*$","\\1",fname,perl=TRUE)

答案 3 :(得分:2)

您可以使用str_extract_all()包中的stringr来匹配给定输入中的所有数字,然后从结果数组中抓取捕获的组#2:

library(stringr)

str_extract_all(fname, "([0-9]+(?:\\.[0-9]+)?)")

答案 4 :(得分:1)

根据您的评论,您可以使用此_[A-Z]+(\d+(\.\d+)?),如图所示here。作为一个小调,这个提议的答案并没有做任何发布的答案。我只是觉得它更易读,更容易理解。

如果你知道完全字符,那么用所述字符替换[A-Z]部分可能是有意义的。这将使表达更加直观。