2013-10-29 11 views
6

Python正規表現を使用して、非常に大きなログファイルを分析しています。 「java:」(ログファイルはJavaプログラムによって作成されます)の前にある数字を除いて、ログファイル内のすべての数字を置き換える必要があります。一致する数字の前に文字列がない

これは、私たちが言ってラインを持っている与えられたことを意味します

これが限界= 300は53ラウンドを行うと偽のテストラインであり、エラーが(Abc.java:417)にあり、いくつかのより多くの

番号300と53を交換する必要があります、ではなく417

私はライン単位でフィルタリングし、ないすべての行がjava:[number]が含まれていることに留意すべきです。

私が得ている最も近いです((?<!java:)[0-9]+)

+2

何を試しましたか?何かをしようとすることは学習の過程です、あなたはそれを行うべきです。 – HamZa

+3

ルックアップ**ネガティブなルックアヘッドアサーション**。彼らはあなたが何をしているかを正確に行うように設計されています。 –

+1

申し訳ありませんが、私は間違いなく私が完了する前に質問を保存しました。今すぐ更新されました。私は否定的なlookbehindを試みましたが、数字以外の文字が現れるまで以下の数字のいずれかにマッチしないようにするのに問題があります。 – beruic

答えて

4

はおそらく

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

で何が起こっているか確認してください、この時点での試合、

java: 
    ^

が失敗した、ということですが、その後、この時点で、

012実際には ava:4java:ではないため、

が成功します。

だけで「完全」の数字が考慮されるように、あなただけの

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

、1、より多くの負の後読みを追加する必要があります。

+0

それはまさに私が探していたものと思われます。私は '[0-9] *'を否定的なlookbehindに入れて、それをだまそうとしました(私の思考を知らず、私の脳はこれを揚げています)。 あなたのソリューションを今すぐテストしてください:) – beruic

+0

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

+0

@beruic - 実際、あなたの戦略は直感的に正しいものでした。 _that_の問題はおそらく、ほとんどの正規表現エンジンが_variable-width lookbehindアサーションをサポートしていないことであり、 '*'は確かにそれを「可変幅」にします。 –

関連する問題