2013-10-29 11 views
6

Analizuję niektóre bardzo duże pliki dziennika za pomocą wyrażeń regularnych w języku Python. Potrzebuję zastąpić każdy numer w pliku dziennika, z wyjątkiem liczb, które są poprzedzone przez "java:" (pliki dziennika są tworzone przez program java).Numery dopasowań nie są poprzedzone ciągiem znaków

Oznacza to, że biorąc pod uwagę, że mamy linię mówiąc:

To jest podrobiony linia testowa z limit = 300 robi 53 rund, a błąd jest (Abc.java:417), a niektóre bardziej

numery 300 i 53 powinny zostać zastąpione, ale nie 417.

filtrować na podstawie wiersza, a należy zauważyć, że nie wszystkie wiersze zawierają java:[number].

Najbliżej mam zdobyć to ((?<!java:)[0-9]+)

+2

Co próbowaliście? Próbowanie czegoś jest procesem uczenia się, powinieneś to zrobić. – HamZa

+3

Poszukaj ** negatywnych twierdzeń lookbehind **. Są zaprojektowane tak, by robić dokładnie to, na co masz ochotę. –

+1

Przepraszam, przypadkowo uratowałem to pytanie, zanim skończyłem. Teraz jest aktualizowany. Próbowałem negatywnego lookbehind, ale mam problem z tym, że nie pasuje do żadnej z poniższych liczb, dopóki nie pojawi się znak nieliczący. – beruic

Odpowiedz

4

Prawdopodobnie co się dzieje z

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

jest to, że na pewno, mecz na to punktowej

java: 
    ^

nie powiedzie się, ale potem w tym punkcie,

java:4 
    ^

Pomyślnie, ponieważ rzeczywiście, ava:4 nie jest java:.

Będziesz po prostu trzeba dodać jeszcze jeden negatywny lookbehind,

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

tak, że tylko „kompletna” Liczby są uznawane.

+0

To wydaje się być dokładnie tym, czego szukałem. Próbowałem umieścić '[0-9] *' w negatywnym lookbehind, aby spróbować oszukać (nie wiem co myślałem, mój mózg się nad tym smaży). Testowanie rozwiązania teraz :) – beruic

+0

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

+0

@beruic - W rzeczywistości twoja strategia była intuicyjnie poprawna. Problem z _that_ jest prawdopodobnie taki, że większość silników wyrażeń regularnych nie obsługuje _sercji zmiennej o zmiennej szerokości, a "*" z pewnością czyni ją "zmienną szerokością". –

Powiązane problemy