2013-10-29 3 views
6

파이썬 정규식을 사용하여 매우 큰 로그 파일을 분석 중입니다. 앞에 'java :'가 붙은 숫자를 제외하고 로그 파일의 모든 숫자를 대체해야합니다 (로그 파일은 Java 프로그램에 의해 작성됩니다).일치하는 문자열 앞에 문자열이 없습니다.

이것은 우리가 말하는 라인을 가지고 주어진 것을 의미한다 :

이 제한 = 300은 53 라운드를하고있는 가짜 테스트 라인이며, 오류가 (Abc.java:417)에 좀 더

숫자 300과 53를 교체해야하지만 417

I는 라인 단위로 필터링하고, 모든 라인 java:[number]를 포함하는 것이 주목되어야한다.

내가 찍었을 가장 가까운이 ((?<!java:)[0-9]+)

+2

시도한 내용은 무엇입니까? 무언가를 시도하는 것은 배우는 과정이므로, 그렇게해야합니다. – HamZa

+3

조회 ** 부정적인 표정 어설 션 **. 그들은 당신이하고있는 것을 정확하게하기 위해 고안되었습니다. –

+1

죄송합니다. 끝나기 전에 실수로 질문을 저장했습니다. 이제 업데이트되었습니다. 나는 부정적인 lookbehind를 시도했으나 숫자가 아닌 문자가 나타날 때까지 다음 숫자 중 어느 것과도 일치하지 않게하는 데 어려움이 있습니다. – beruic

답변

4

아마

((?<!java:)[0-9]+) 

에 무슨 일이 일어나고 있는지, 시점에서 경기,

java: 
    ^

이 실패한다는 것입니다,하지만 이 시점에서

java:4 
    ^

이 실제로 성공하기 때문에 실제로 ava:4java:이 아닙니다.

당신은 한 번 더 부정적인 lookbehind,

((?<!java:)(?<![0-9])[0-9]+) 
      ^^^^^^^^^^ 

이 너무 만이 "완전한"숫자가 고려를 추가해야 만합니다.

+0

그게 내가 찾고 있던 것 같다. 나는 부정적인 lookbehind에'[0-9] *'를 넣으려고 시도했다. (내 생각은 몰랐고, 내 뇌는 이걸 튀기고있다.) 지금 솔루션을 테스트하십시오 :) – beruic

+0

@beruic use [regex101.com] (http://regex101.com)! – HamZa

+0

@beruic - 사실, 당신의 전략은 직관적으로 정확했습니다. _that_의 문제는 아마도 대부분의 정규 표현식 엔진이 _variable-width lookbehind assertions_를 지원하지 않을 것이고'*'는 확실히 그것을 "가변 폭"으로 만듭니다. –

관련 문제