2016-06-30 2 views
2

특정 문자열 다음에 6 자리 숫자 (양수 또는 음수)를 추출하는 정규식을 작성하려고합니다. 즉 'LogL ='입니다.특정 단어 다음에 추출한 숫자

특정 소프트웨어의 텍스트 출력에 있습니다.

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

가 양수 작동하지 않습니다 :
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에서 다음을 시도했다. 그리고 나는 그것의 아주 조잡하고 추악한 방법을 상상합니다. (1) (2) (3)

나는 종류의 손실 오전 정규식 표현을 이해할 수없는 것 : 나는 시도 regex101.com

유래와 관련된 질문에 간섭했습니다. 나는 이것이 케이크 한 장이라고 확신한다. 도움?

답변

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

링크 및 답변 감사합니다! regex 표현을 배우기 시작해야합니다. 그들은 매우 유용하다고 생각됩니다. – 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

왜 downvoted입니까? 이것이 유효한 접근 방법이 아닌가? – akrun

+1

잘 모르겠다. 답변 주셔서 감사합니다 :) – tstev

+0

upvote 주셔서 감사합니다. – akrun

관련 문제