Pythonの日付形式の正規表現が必要です
「3月29日」が欲しい
ただし、「3月29日、YYYY」の「3月29日」ではありません。YYYYは2012年ではありません。
ありがとう、
チェン
正規表現を使用する必要はありません。
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
このように聞こえます:
re.compile(r'''^
(january|february|march|...etc.)
\s
\d{1,2}
\s
(,\s2012)?
$''', re.I)
あなたの質問は100%明確ではありませんが、着信文字列から日付を解析しようとしているようです。その場合は、正規表現ではなくdatetime
モジュールを使用してください。ロケールなどを処理する可能性が高くなります。この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
また、有効な入力がない場合は関数が戻ることに注意してください。これは、状況に応じて簡単に変更できます。さまざまなフォーマットコードの詳細については、メソッドのドキュメントをstrptime()
参照してください。
その使用例:
>>> 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
これは、正規表現で処理するのが難しい可能性がある違法な日付(たとえば、3月39日)をキャッチして受け入れることを拒否することに気付くでしょう。
月と日を取得するための生の正規表現は次のとおり(january|february|...) \d\d?(?!\s*,\s*\d{4})
です。
(?!\s*,\s*\d{4})
先を見越して、文字列の後に。が続かないことを確認します, YYYY
。私はあなたの質問のこの部分を理解したと思います。march 29, 2012
3月29日の後にコンマスペース年が続くため、一致しません。
私はそれを自分で理解しました
(?!\ s *、\ s *(1 \ d \ d \ d | 200 \ d | 2010 | 2011))