2012-06-18 4 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, потому что после 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), который может быть сложно справиться с регулярным выражением.

Смежные вопросы