2013-10-29 12 views
6

Tôi đang phân tích một số tệp nhật ký rất lớn sử dụng Python regex. Tôi cần phải thay thế mọi số trong tệp nhật ký, ngoại trừ các số được đặt trước bởi 'java:' (tệp nhật ký được tạo bởi chương trình java).Số trận đấu không có chuỗi

này có nghĩa là cho chúng ta có một dòng nói:

Đây là một dòng thử nghiệm giả với giới hạn = 300 làm 53 viên đạn và có sai số trong (Abc.java:417) và một số chi tiết

Các con số 300 và 53 nên được thay thế, nhưng không phải 417.

tôi lọc theo phương pháp đường, và cần lưu ý rằng không phải tất cả dòng chứa java:[number].

Gần nhất tôi đã nhận là ((?<!java:)[0-9]+)

+2

Bạn đã thử gì? Cố gắng một cái gì đó là một quá trình học tập, bạn nên làm điều đó. – HamZa

+3

Tra cứu ** xác nhận tìm kiếm tiêu cực **. Chúng được thiết kế để làm chính xác những gì bạn đang theo dõi. –

+1

Xin lỗi, tôi vô tình lưu câu hỏi trước khi tôi hoàn thành. Bây giờ nó đã được cập nhật. Tôi đã cố gắng tìm kiếm tiêu cực, nhưng gặp khó khăn khi làm cho nó không phù hợp với bất kỳ số nào sau đây cho đến khi một ký tự không phải là số xuất hiện. – beruic

Trả lời

4

Có lẽ những gì đang xảy ra với

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

là, chắc chắn, trận đấu tại này điểm,

java: 
    ^

thất bại, nhưng sau đó tại _điểm này,

java:4 
    ^

thành công, bởi vì thực sự, ava:4 không phải là java:.

Bạn sẽ chỉ cần thêm một lookbehind tiêu cực,

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

để chỉ "hoàn thành" con số này được xem xét.

+0

Điều đó dường như chính xác những gì tôi đang tìm kiếm. Tôi đã cố gắng đặt '[0-9] *' vào vẻ ngoài tiêu cực để cố gắng đánh lừa nó (dunno những gì tôi đang nghĩ, bộ não của tôi đang rán về điều này). Kiểm tra giải pháp của bạn ngay bây giờ :) – beruic

+0

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

+0

@beruic - Trên thực tế, chiến lược của bạn đã được chỉnh sửa trực quan. Vấn đề với _that_ có lẽ là hầu hết các công cụ biểu thức thông thường không hỗ trợ _beiable-width lookbehind assertions_, và '*' chắc chắn làm cho nó "biến chiều rộng". –

Các vấn đề liên quan