2012-06-18 49 views

回答

0

我想通了由自己

(\ S * \ S *(1 \ d \ d \ d |?!200 \ d | 2010 | 2011))

+2

您可能想要閱讀顯示正則表達式替代方案的其他答案。你不需要(或想)使用正則表達式。這正是日期時間模塊的用途。 – alan

1

聽起來是這樣的:

re.compile(r'''^ 
    (january|february|march|...etc.) 
    \s 
    \d{1,2} 
    \s 
    (,\s2012)? 
    $''', re.I) 
0

獲取月份和日期的原始正則表達式是:(january|february|...) \d\d?(?!\s*,\s*\d{4})

(?!\s*,\s*\d{4})向前看,並確保字符串沒有後跟, YYYY。我希望我能理解你的問題的這一部分。它不會匹配march 29, 2012,因爲3月29日之後是逗號空間年。

+1

聽起來像他想要選擇允許'2012',只是沒有其他的一年。 –

2

你不需要使用正則表達式。

import datetime 

dt = datetime.datetime.now() 
print dt.strftime('%B %d') 

結果將是:

June 18 

順便說一句,如果要排序的日期列表,並顯示出今年只有這些,這是2012年的,比嘗試使用split()

line = "March 29, YYYY" 
if int(line.split(',')[1]) = 2012 
    print line 
else 
    pass 
1

你的問題不是100%清楚,但它看起來像你試圖從傳入的字符串解析日期。如果是這樣,請使用datetime module而不是正則表達式。它更容易處理datetime.datetime.strptime()方法被設計來讀取字符串日期的語言環境等,所以你可以試試下面的:

import datetime 

def myDate(raw): 
    # Try to match a date with a year. 
    try: 
     dt = datetime.datetime.strptime(raw, '%B %d, %Y') 

     # Make sure its the year we want. 
     if dt.year != 2012: 
      return None 

    # Error, try to match without a year. 
    except ValueError: 
     try: 
      dt = datetime.datetime.strptime(raw, '%B %d') 
     except ValueError: 
      return None 

     # Add in the year information - by default it says 1900 since 
     # there was no year details in the string. 
     dt = dt.replace(year=2012) 

    # Strip away the time information and return just the date information. 
    return dt.date() 

strptime()方法返回一個datetime對象即日期時間信息。因此最後一行調用date()方法返回日期。還請注意,當沒有有效的輸入時,該函數返回None - 您可以輕鬆更改此項以執行您所需的任何操作。有關不同格式代碼的詳細信息,請參見the documentation of the strptime() method

其使用的幾個例子:

>>> myDate('March 29, 2012') 
datetime.date(2012, 3, 29) 
>>> myDate('March 29, 2011') 
>>> myDate('March 29, 2011') is None 
True 
>>> myDate('March 29') 
datetime.date(2012, 3, 29) 
>>> myDate('March 39') 
>>> myDate('March 39') is None 
True 

你會發現這捕獲和拒絕接受非法日期(例如,39月),這可能會非常棘手用正則表達式來處理。