正则表达式:提取以R中的模式开头的十进制数

时间:2017-10-16 05:50:50

标签: r regex

不确定我在这里做错了什么。 我在文本文件中有行...目标行看起来像这样

  
      
  • Nsource.Inhibitor 3 81.63 27.21 1.84 0.008
  •   
  • Nsource.Inhibitor 3 90.31 17.21 0.84< 0.001
  •   

我想从最后提取0.008和<0.001。

然而,还有其他行意味着我们必须使用行的第一部分作为模式的一部分....

  
      
  • Nsource 1 1238.10 1238.10 40.29&lt; .001
  •   
  • 抑制剂3 1484.41 494.80 16.10&lt; .001
  •   

我的尝试

reline <- "+ Nsource.Inhibitor   3   81.63   27.21   1.84    0.008"
decnum <- "[[:digit:]]+\\.*[[:digit:]]*"
chk <- paste0("+ Nsource.Inhibitor[:blank:]+", decnum, "[:blank:]+", decnum, "[:blank:]+", decnum, "[:blank:]+", decnum,
       "[:blank:]+", "([[:digit:]]+\\.*[[:digit:]]*)")
gsub(chk, "\\1",reline)

返回:

  

“+ Nsource.Inhibitor \ t 3 \ t 81.63 \ t 27.21 \ t 1.84 \ t \ t030”

感谢您的帮助。

马特

4 个答案:

答案 0 :(得分:1)

这样的东西?

library(stringr)
strings <- c("Nsource.Inhibitor 3 81.63 27.21 1.84 0.008", "Nsource.Inhibitor 3 90.31 17.21 0.84 <0.001", 
             "Nsource 1 1238.10 1238.10 40.29 <.001", "Inhibitor 3 1484.41 494.80 16.10 <.001")

str_match(strings, "(?=^Nsource.Inhibitor).*?(<?\\d+\\.\\d+)$")[,2]

这会产生

[1] "0.008"  "<0.001" NA       NA      

它确保在字符串的开头有Nsource.Inhibitor,然后才匹配该行的最后\d+.\d+个模式(最终加上<)。

答案 1 :(得分:1)

如果目标行包含“Nsource.Inhibitor”且最后一个字符是数字,并且您想要提取最后一个空格后的所有字符,请尝试:

gsub(".*Nsource\\.Inhibitor.*\\s(.*[0-9])$", "\\1", reline)

如果ignore.case = TNsource出现无上限,您可以添加Inhibitor

示例:

> reline <- "+ Nsource.Inhibitor   3   81.63   27.21   1.84    <0.008"
> output <- gsub(".*Nsource\\.Inhibitor.*\\s(.*[0-9])$", "\\1", reline, ignore.case = T)
> output
[1] "<0.008"

> reline <- "+ Nsource.Inhibitor   3   81.11  27  1232   23  123111  55.5555  0.38"
> output <- gsub(".*Nsource\\.inhibitor.*\\s(.*[0-9])$", "\\1", reline, ignore.case = T)
> output
[1] "0.38"

答案 2 :(得分:1)

strings <- c("Nsource.Inhibitor 3 81.63 27.21 1.84 0.008", "Nsource.Inhibitor 3 90.31 17.21 0.84 <0.001",  "Nsource 1 1238.10 1238.10 40.29 <.001", "Inhibitor 3 1484.41 494.80 16.10 <.001")

下面的表达式使用grep来获取包含子字符串的字符串&#39; Nsource.Inhibitor&#39;,将字符串拆分为' ',并返回每个分割字符串的第6个元素。

sapply(strsplit(strings[grep('Nsource.Inhibitor', strings)], ' '), '[[',6)

答案 3 :(得分:1)

这里没有理由使用正则表达式。只需将文件作为data.frame读取并执行简单的子集化:

DF <- read.table(text = "Nsource.Inhibitor 3 81.63 27.21 1.84 0.008
           Nsource.Inhibitor 3 90.31 17.21 0.84 <0.001
           Nsource 1 1238.10 1238.10 40.29 <.001
           nhibitor 3 1484.41 494.80 16.10 <.001", stringsAsFactors = FALSE) #you can read from file directly

DF[DF$V1 == "Nsource.Inhibitor", ncol(DF)]
#[1] "0.008"  "<0.001"