2017-10-09 10 views
1

各行の日付、時刻、システムイベントメッセージから始まるログファイルを解析しています。私は正規表現を使用して、strptimeや他の時間モジュールを使用して計算を行う必要なしに、必要な日付と時刻を簡単に一致させたいと考えています。私は9月12日の日付と特定の時間(9:23:45-09:23:50)すなわち5秒間のログを照合しようとしました。ログファイルは、この形式である:Pythonで正規表現を使用して特定の時刻と日付を一致させる方法

Sep 12 09:23:45 localhost systemd: Switching root. 
Sep 12 09:23:45 localhost journal: Journal stopped 
Sep 12 09:23:46 localhost journal: Runtime journal is using 8.0M (max allowed 91.1M, trying to leave 136.7M free of 903.7M available ? current limit 91.1M). 
Sep 12 09:23:46 localhost journal: Runtime journal is using 8.0M (max allowed 91.1M, trying to leave 136.7M free of 903.7M available ? current limit 91.1M). 
Sep 12 09:23:46 localhost systemd-journald[88]: Received SIGTERM from PID 1 (systemd). 

私が試してみましたPythonコード:

import fileinput,re 
for i in fileinput.input(): 
    if (re.search(r'Sep 12 09:23:[45-50]',i)): 
     print(i) 

をまた、私は大きなを解析しようとしていた場合、誰もがいただきました。この同じコードの影響を私に言うことができます100 GBを超えるファイルですか?メモリのオーバーヘッドを減らすためにこのコードを書き直すことはできますか?

+0

:だからあなたのスクリプトは、少ないメモリとCPU使用 '[45-50]は' 45と50の間のすべての数値を意味するものではありませんがそれは4、または5と5の間の任意の数を意味し、一致する可能性のあるものは 'Sep 12 09:23:(45 | 46 | 47 | 48 | 49 | 50)'ですが、もっと巧妙な解決策が必要です。また、別の質問を別の質問として尋ねてください.2つではありません(また、大規模なファイルをPythonで解析することについてまだ何もない場合は前にチェックしてください)。 – zezollo

+1

これも興味深いかもしれません:http://www.regular-expressions.info/numericranges.html – zezollo

答えて

3

私は少し異なる正規表現でいいと思う:

^Sep 12 09:23:(?:4[5-9]|50) 

説明:[45-50]55、および04、すべてのものと一致する文字クラスです。これは、文字クラスがchar-by-charで評価されるためです。このための古典的な修正は、番号のプレフィックスによって代替案を定義することです:

  • (?:...)は、いくつかのリソースを温存
  • 4[5-9]試合番号4546、... 49
  • 他のグループ非記録であります代替は50、あなたの間隔の上限です。

デモhere

正規表現を1回だけコンパイルすることができます。

import fileinput,re 
# this is the speedup 
regex = re.compile('^Sep 12 09:23:(?:4[5-9]|50)') 
for i in fileinput.input(): 
    # slightly different regex match call 
    if (regex.match(i)): 
     print(i) 
あなたの正規表現が一致しません