2016-06-30 57 views
2

我试图建立一个正则表达式来提取某个字符串后的6位数字(正数或负数),即'LogL ='。某个单词之后提取数字

它来自某些软件的文本输出。

7 LogL=-3695.47  S2= 9.0808  1891 df 2.263  0.2565  
    9 LogL= 2456.30  S2= 1.2789  1785 df 1.244  0.1354  

我试着在R中的以下内容:

txt <- " 9 LogL= 2456.30  S2= 1.2789  1785 df 1.244  0.1354 " 
as.numeric(unlist(strsplit(sub(".*LogL=*", "", txt), " "))[1]) 

不为正数工作。我想像它是非常粗糙/丑陋的方式去实现它。 我试图插手的regex101.com

尝试#1相关的问题:(1)(2)(3)

我有点失去了,似乎无法理解正则表达式的表达式。我相信这是一块蛋糕。帮帮我?

回答

4

我会使用一个look-behind regex

txt <- " 7 LogL=-3695.47  S2= 9.0808  1891 df 2.263  0.2565  
      9 LogL= 2456.30  S2= 1.2789  1785 df 1.244  0.1354 " 
pattern <- "(?<=LogL\\=)\\s*\\-*[0-9.]+" 
m <- gregexpr(pattern, txt, perl = TRUE) 
as.numeric(unlist(regmatches(txt, m))) 
#1] -3695.47 2456.30 
+0

欣赏链接和答案!需要开始学习正则表达式。看起来它们非常有用。 – tstev

4

尝试

LogL=\s*(-?\d+(?:\.\d+)?) 

它的文本(LogL),等号后面的任何数量的空格相匹配。然后它捕获:

  • 可选-
  • 数字,至少一个
  • 和任选的.随后在至少一个数位。

Check it here at regex101

+0

谢谢!也感谢解释。帮助我理解正则表达式的混乱。 – tstev

3

如果你有兴趣的可以在非正则表达式的选择:

library(stringr) 
txt <- " 9 LogL= 2456.30  S2= 1.2789  1785 df 1.244  0.1354 " 
word(txt, 2, sep = "=") %>% word(2, sep = " ") 

它与正数和负数。

2

我们可以使用str_extract

library(stringr) 
as.numeric(str_extract_all(txt, "(?<=LogL=\\s{0,1})[-0-9.]+")[[1]]) 
#[1] -3695.47 2456.30 

或者,我们可以使用和strsplit组合gsub

as.numeric(gsub(".*LogL=\\s*|\\s+.*", "", trimws(strsplit(txt, "\n")[[1]]))) 
#[1] -3695.47 2456.30 
+0

为什么低调?这不是一种有效的方法吗? – akrun

+1

不知道。非常感谢您的回答:) – tstev

+0

感谢您的支持。 – akrun

相关问题