2012-04-12 43 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是一個轉義字符,你將得到一個單字符(換行符)。

  • 在正則表達式,當你將一系列在方括號中的字符,你會得到一個「字符類」匹配任何字符。所以當你把[Date:\s]+你會匹配Date:,但你也會匹配taD:e或這些字符的任何其他組合。只需放入一個與自身匹配的字符串就行了,比如Date:

+0

感謝steveha,從來沒有聽說過defaultdict之前。我認爲這可以工作。 – Nightvein 2012-04-12 05:59:13

+0

好的。順便說一句,如何使用格式打印defaultdict對象? – Nightvein 2012-04-12 06:04:42

+1

'defaultdict'在各方面都像一個普通的老式'dict'一樣行動,除了如果你想查找某些東西並且它不在那裏,它會自動添加。如果你想打印一個找到的月份列表以及它們的計數,你可以在c:print(「%s:%d」%(month, c [month])''但是這會按隨機順序打印月份,我建議你列出幾個月,比如'lst_months = ['Jan','Feb',...,'Dec]',然後遍歷在那個列表中的幾個月,並打印它們或其他什麼。 – steveha 2012-04-12 06:22:19