web-dev-qa-db-ja.com

Python日付に一致する正規表現

Pythonのどの正規表現を使用して、「11/12/98」のような日付を一致させますか?

35
clumpter

通常、正規表現を使用する代わりに、文字列を_datetime.datetime_オブジェクトとして解析することをお勧めします。

_In [140]: datetime.datetime.strptime("11/12/98","%m/%d/%y")
Out[140]: datetime.datetime(1998, 11, 12, 0, 0)

In [141]: datetime.datetime.strptime("11/12/98","%d/%m/%y")
Out[141]: datetime.datetime(1998, 12, 11, 0, 0)
_

その後、_datetime.datetime_オブジェクトの属性として、日、月、年(および時間、分、秒)にアクセスできます。

_In [143]: date.year
Out[143]: 1998

In [144]: date.month
Out[144]: 11

In [145]: date.day
Out[145]: 12
_

スラッシュで区切られた数字のシーケンスが有効な日付を表すかどうかをテストするには、_try..except_ブロックを使用できます。無効な日付はValueErrorを発生させます:

_In [159]: try:
   .....:     datetime.datetime.strptime("99/99/99","%m/%d/%y")
   .....: except ValueError as err:
   .....:     print(err)
   .....:     
   .....:     
time data '99/99/99' does not match format '%m/%d/%y'
_

長い文字列で日付を検索する必要がある場合は、正規表現を使用して、スラッシュで区切られた数字を検索できます。

_In [146]: import re
In [152]: match = re.search(r'(\d+/\d+/\d+)','The date is 11/12/98')

In [153]: match.group(1)
Out[153]: '11/12/98'
_

もちろん、無効な日付も一致します。

_In [154]: match = re.search(r'(\d+/\d+/\d+)','The date is 99/99/99')

In [155]: match.group(1)
Out[155]: '99/99/99'
_

match.group(1)が有効な日付文字列を返すことを確認するには、上記のように_datetime.datetime.strptime_を使用して解析できます。

44
unutbu

この正規表現を使用すると、さまざまな種類の日付/時刻サンプルを検証できます。少し変更するだけです。

^\d\d\d\d/(0?[1-9]|1[0-2])/(0?[1-9]|[12][0-9]|3[01]) (00|[0-9]|1[0-9]|2[0-3]):([0-9]|[0-5][0-9]):([0-9]|[0-5][0-9])$->これを検証:2018/7/12 13:00:00

使用する形式に合わせて、次のように変更します。

^(0?[1-9]|[12][0-9]|3[01])/(0?[1-9]|1[0-2])/\d\d$->これを検証します:11/12/98

私は、以下のフォーマットで日付に対して以下のREがうまく機能しているのを見つけました;

  1. 14-11-2017
  2. 14.11.2017
  3. 14 | 11 | 2017

2000年から2099年までの年を受け入れることができます

最後に$を追加することを忘れないでください。そうでない場合は、14-11-201または20177を受け入れます

date="13-11-2017"

x=re.search("^([1-9] |1[0-9]| 2[0-9]|3[0-1])(.|-)([1-9] |1[0-2])(.|-|)20[0-9][0-9]$",date)

x.group()

出力= '13 -11-2017 '

3
aditya Prakash

まあ、私の理解から、単に与えられた文字列でこの形式を一致させるために、私はこの正規表現を好む:

pattern='[0-9|/]+'

より厳密な方法で形式を一致させるには、次のようにします。

pattern='(?:[0-9]{2}/){2}[0-9]{2}'

個人的には、「検証」だけでなく「検索」と「抽出」に正規表現を使用することがあるため、unutbuの答えに同意できません。

1
J.Melody