2016-06-30 89 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

相關問題