【问题标题】:Extracting numbers from a string including decimels and scientific notation从字符串中提取数字,包括小数和科学记数法
【发布时间】:2015-06-19 02:20:31
【问题描述】:

我有一些看起来像

的字符串
x<-"p = 9.636e-05"

我想只使用 gsub 提取数字。到目前为止我有

gsub("[[:alpha:]](?!-)|=|\\^2", "", x)

但这从科学记数法中删除了“e”,给了我

"  9.636-05"

不能使用 as.numeric 转换为数字。我知道可以使用前瞻来匹配“-”,但我不知道该怎么做。

【问题讨论】:

  • 试试sub('.* ', '', x)#[1] "9.636e-05"
  • 字符串中有没有其他模式
  • 我的字符串中的其他模式是 "slope=" 和 "R^2="

标签: regex r


【解决方案1】:

通过 sub 或 regmatches 函数。

> x<-"p = 9.636e-05"
> sub(".* ", "", x)
[1] "9.636e-05"
> regmatches(x, regexpr("\\S+$", x))
[1] "9.636e-05"
> library(stringi)
> stri_extract(x, regex="\\S+$")
[1] "9.636e-05"

【讨论】:

    【解决方案2】:

    您可以使用以下方法来最初删除字符串开头的所有非数字字符:

    sub('^\\D+', '', x)
    

    【讨论】:

    • 谢谢,我确信有很多方法可以解决这个问题,但这是我要使用的解决方案
    • @CactusWoman 但这个不适用于您的 r**2 案例:x&lt;-"R^2 = .6"; sub('^\\D+', '', x) 你会得到[1] "2 = .6" @akrun 的意愿
    • @rawr 我将其修改为 '^\\D+|2 ='
    • @rawr,如果 OP 也需要替换该类型.. .* 很好。
    【解决方案3】:

    试试

    format(as.numeric(gsub("[^0-9e.-]", "", x)), scientific = FALSE)
    # [1] "0.00009636"
    

    【讨论】:

      【解决方案4】:

      你可以试试

       sub('.* = ', '', x)
       #[1] "9.636e-05"
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-11-22
        • 1970-01-01
        • 2017-08-04
        • 1970-01-01
        • 2019-04-22
        相关资源
        最近更新 更多