2012-04-12 4 views
1

本質的には、ディレクトリ内の複数のファイルから行を読み込み、正規表現を使用して一種のタイムスタンプの始まりを見つけようとしています。また、正規表現内に月リストのインスタンスを配置し、それが何回出現するかに基づいて各月のカウンタ。私は以下のコードをいくつか持っていますが、それはまだ進行中の作業です。私はdate_parseをクローズしたことを知っていますが、それが私が求めている理由です。そして、より効率的な方法を考えることができるなら、別の提案を残してください。ありがとう。正規表現内のリストのメンバーのインスタンスをPythonでマッチさせることができますか?

months = ['Jan','Feb','Mar','Apr','May','Jun',\ 
      'Jul','Aug','Sep','Oct','Nov',' Dec'] 
date_parse = re.compile('[Date:\s]+[[A-Za-z]{3},]+[[0-9]{1,2}\s]') 
counter=0 
for line in sys.stdin: 
    if data_parse.match(line): 
     for month in months in line: 
      print '%s %d' % (month, counter) 

答えて

2

正規表現では、代替パターンのリストを縦棒で区切って指定することができます。

http://docs.python.org/library/re.html

from collections import defaultdict 

date_parse = re.compile(r'Date:\s+(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)') 

c = defaultdict(int) 

for line in sys.stdin: 
    m = date_parse.match(line) 
    if m is None: 
     # pattern did not match 
     # could handle error or log it here if desired 
     continue # skip to handling next input line 
    month = m.group(1) 
    c[month] += 1 

いくつかの注意:

  • 私はバックスラッシュは文字列のエスケープにならないように、あなたは、パターンのために(r''またはr""付き)生の文字列を使用をお勧めします。たとえば、普通の文字列の中では、\sはエスケープではなく、バックスラッシュの後ろに 's'が付きますが、\nはエスケープで、1文字(改行)が得られます。

  • 一連の文字を角括弧で囲むと、いずれかの文字に一致する「文字クラス」が得られます。したがって、[Date:\s]+を入力すると、Date:と一致しますが、taD:eまたはこれらの文字の組み合わせも一致します。 Date:のように、それ自身と一致する文字列を入れるだけで大​​丈夫です。

+0

ありがとうございますsteveha、以前はdefaultdictのことは聞いたことがありません。私はこれがうまくいくと思う。 – Nightvein

+0

btw、どのようにフォーマットを使用してdefaultdictオブジェクトを印刷しますか? – Nightvein

+1

'defaultdict'は何かを見ようとすると自動的に追加されるという点を除いて、あらゆる点で普通の' dict'と同じように動作します。見つかった月のリストを印刷する場合は、他のdict: 'for month in c:print("%s:%d "%(月、しかし、それは月をランダムな順序で印刷します。lst_months = ['Jan'、 'Feb'、...、 'Dec' 'のような月のリストを作成してから、そのリストに数ヶ月、印刷したり、何でも印刷したりできます。 – steveha