我已经浏览了一半的stackoverflow来寻找这个,但似乎没有什么完全匹配,抱歉,如果错了。
我有一个格式为:
的字符串 fname <-'FS1_SCN0.83_axg3.csv'
我想提取第二个数字,恰好是小数,但也可以是一个整数,结果得到0.83(如果是整数则为3)。我得到的最近的是:
gsub("[^0-9.]","\\2",fname)
生成fname(10.833。)中的所有数字和小数点,但作为整个字符串。
提前致谢,p。
答案 0 :(得分:3)
要获得第二个号码,
regmatches(x, regexpr("^\\D*\\d+\\D*\\K\\d+(?:\\.\\d+)?", x, perl=TRUE))
或
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
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]
部分可能是有意义的。这将使表达更加直观。