2016-08-18 2 views
0

로그 파일에서 특정 키워드 사이에 문자열/줄을 추출하고 변수 또는 카운터에 할당하려고합니다. 예를 들어 다음과 같습니다키워드 사이의 문자열 추출 및 변수에 할당

This is line 1 of the log file 
line 2 of the log file 
DEF this is something in line 3 
this is a 123 456 
34 
cat dog rainfall 
some relevant information 
ABC 
DEF something in this line 
this is a 123 678 
ABC 

시작 키워드 "DEF"이고 마지막 키워드는 "ABC"입니다 : 내가 좋아하는 뭔가를 한 로그 파일이 있습니다. 그리고이 키워드들 사이에 "this is"라는 키워드가있는 라인을 추출하려고합니다. 출력해야합니다 같은 :

반복 1 = [123, 456] 반복 2 = [123, 678]

내 코드까지 ..

import os 
import re 

def GetTheSubString(logfile): 
    with open(logfile) as p: 
     for result in re.findall('DEF(.*?)ABC', p.read(), re.S): 
      return (result) 

substr = GetTheSubString("P3.log") 
substr 

이 저를 반환 첫 번째 부분 문자열의. 이미 123과 456의 매핑을 수행하는 또 다른 코드 조각이 있지만이 루프에 어떻게 묶일 지 잘 모르겠습니다. 어떤 제안이 도움이 될 것입니다. 감사!

답변

0

당신의 정규식이 맞습니다. 당신이 잘못하고있는 유일한 일은 첫 번째 결과 자체를 반환하는 것입니다. re.findall('DEF(.*?)ABC', p.read(), re.S)이 모든 관련 콘텐츠를 찾았지 만 반복하고 처음으로 return을 클릭하면 첫 번째 요소 만 반환됩니다. 다음과 같이 변경하십시오.

>>> import os 
>>> import re 
>>> 
>>> def GetTheSubString(logfile): 
...  with open(logfile) as p: 
...   return re.findall('DEF(.*?)ABC', p.read(), re.S) 
... 
>>> substr = GetTheSubString("P3.log") 
>>> print substr 
[' this is something in line 3\nthis is a 123 456\n34\ncat dog rainfall \nsome relevant information\n', ' something in this line\nthis is a 123 678\n'] 

이제 잡아 둔 콘텐츠에 원하는대로 적용 할 수 있습니다. 이 기능 자체를 수행하려는 경우

그러나, 나는 할 것이다 : 여기

>>> import os 
>>> import re 
>>> 
>>> def GetTheSubString(logfile): 
...  with open(logfile) as p: 
...   return re.findall('DEF(?:.*?)this is a (\d+) (\d+)(?:.*?)ABC', p.read(), re.S) 
... 
>>> substr = GetTheSubString("a") 
>>> print substr 
[('123', '456'), ('123', '678')] 

은 정규식 '이있는'이 ', 두 숫자에'DEF '사이에있는 모든 일치합니다 $ num1 $ num2 '이고 거기부터'ABC '까지입니다. 그러나 외부 캡처 그룹이 제거되면 숫자 만 반환합니다.

Regular expression visualization

정말 잘 작동

Debuggex Demo

+0

! 고마워요! – Shaz

관련 문제