2016-06-30 31 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]) 

は正の数では動作しません。そして、私はそれについての非常に粗末な/醜い方法を想像しています。 (1)(2)(3)

私は一種の失われていますし、正規表現の表現を理解するように見えることはできません。 は、私が試したregex101.com

のStackOverflowに関する質問におせっかいてみました。私はこれがケーキだと確信しています。助けて?

答えて

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)、任意の数のスペースが続く等号と一致する

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

を試してみてください。それはキャプチャ:

  • 任意-
  • 桁、少なくとも一つ
  • および任意に、少なくとも一つの数字が続く.

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 

それとも私たちはstrsplitgsub

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

なぜそれはdownvotedですか?これは有効なアプローチではありませんか? – akrun

+1

いいえ、考えられません。あなたの答えのために多くのありがとう:) – tstev

+0

アップフォートありがとう。 – akrun

関連する問題