2011-09-19 4 views
0

전에 내가 구문 분석 할 필요가 로그 파일에서 문자열의 집합이 "".파이썬 정규식 마지막 occurance EOL

현재 나는 EOL까지 문자열을 캡처하는 r '(. *?) \ n'을 사용하고 있습니다. 문자열에 콜론이 2 개 이상 사용될 수 있음을 명심하십시오. EOL 전에 사용한 마지막 콜론까지 캡처해야합니다. 또한 문자열에 ":"콜론이 없으면 EOL을 종료 시퀀스로 사용해야합니다.

감사합니다.

EDIT : 더 좋은 예;

2011-07-29 07:29:44,112 [TP-Processor10] ERROR springsecurity.GrailsDaoImpl - User not found: sspm 
    2011-07-29 09:01:05,850 [TP-Processor3] ERROR transaction.JDBCTransaction - JDBC commit failed 
    2011-07-29 08:32:00,353 [TP-Processor1] ERROR errors.GrailsExceptionResolver - Exception occurred when processing request: [POST] /webapp/user/index - parameters: runtime exception 
+0

을'-' 타임 스탬프 내에서 내부'을 구분하기 위해 [TP-프로세서 ..] '와 실제 오류 메시지 앞의 공백 문자는 공백으로 항상 둘러싸여 있다고 가정 할 수 있으며, 그렇지 않은가? –

+0

알았습니다! r '- (. *) : | $' 은 완벽하게 작동하며 모든 요구 사항을 충족합니다. 나를 도와 주신 모든 분들께 감사드립니다. 정규식은 상당히 mf 될 수 있습니다. o.0 @Tim : 내 코드에서 "-"을 모든 줄에있는 것처럼 봤던 문자열로 사용했습니다. 오류 세부 정보를 캡처 한 다음 카운터를 추가하려고합니다. –

답변

2
import re 

for line in open('logfile.log'): 
    match = re.search(r'-(.*):', line) 
    if match: 
     print match.group(1) 
    else: 
     match = re.search(r'-(.*)', line) 
     if match: 
      print match.group(1) 
     else: 
      print 'No match in line', line.strip() 
+0

감사합니다. 줄에 콜론이 여러 개있을 수 있습니다. 나는 마지막 순간을 포착해야합니다. 또한 콜론이 전혀없는 경우 EOL을 캡처해야합니다. –

+0

질문에 "-"과 마지막 ":"사이에 텍스트를 캡처하고 싶다고 말하면 내 스 니펫이하는 것입니다. – infrared

+0

당신이 정확합니다. 내 잘못이야. 감사.^_^ 이제 콜론이없는 경우 EOl을 캡처해야합니다. –

1

r'^.+ -(.+):.*$' 나를 위해 트릭을 수행합니다.

(.+)이 욕심으로 작동합니다. rehere - 특히 *, +?에 대한 Python 설명서를 확인하십시오.

+0

감사합니다. 이것은 실제로 문자열에 사용 된 마지막 "-"을 가져옵니다. 문자열의 경우 입니다. '2011-07-29 08 : 32 : 00,353 [TP-Processor1] 오류 errors.GrailsExceptionResolver - 요청 처리시 예외가 발생했습니다 : [POST]/connectwebapp/user/index - parameters : runtime' 저장 전용 "parameters". 찾고있는 출력은 "요청을 처리 할 때 예외가 발생했습니다 : [POST]/connectwebapp/user/index - parameters" 또한 ":"이없는 행에는 오류가 있습니다. –

2

이 시도 :

"(?<=-).*(?=:[^:]*$)" 

그것은 -과 현재 행의 마지막 : 사이에 일치합니다. 더 콜론이없는 경우, 따라서 당신이 할 수있는, 전혀 일치하지 않습니다 :

r = re.compile("(?<=-).*(?=:[^:]*$)") 
result = r.search(mystring) 
if result: 
    match = result.group(0) 
else: 
    match = "\n" 

이것은 당신이 이, ("더 콜론, 경기 EOL이없는 경우")이 당신 의미 경우 말을하지 " EOL까지 더 결장, 경기 이없는 경우" 다음 하나의 정규식 할 것입니다 :

r = re.compile("(?<=-)(?:[^:]*$|.*(?=:[^:]*$))") 
+0

감사. 당신이 준 정규식은 나를 위해 일하지 않았습니다. 그러나 그것은 내가 원했던 것을 나에게 주었다. r '- (. *) (? = : [^ :] * $)'은 제 요구 사항에 적용됩니다. 동일한 정규 표현식에서 EOL을 추가 할 수있는 방법이 있습니까? 그렇지 않다면 제안한 is/else 루프를 시도해 보겠습니다. –

+0

"작동하지 않았다"는 의미는 무엇입니까? 정규 표현식을 변경 했으므로 그룹 번호에 액세스 할 필요가 없습니다. 1이지만 전체 경기 결과 (그룹 0). –

+0

내 실수. 죄송합니다. 나는 EOL까지 의미했다. –