2

特定の文字列内の正しい形式の日付をいくつでも一致させようとしています。日付を正しい形式にするためには、dd-mm-yyyy の形式で表示する必要があります。したがって、dd と mm は 1 桁だけにすることはできません。2 桁が必要であり、正しい範囲内にある必要があります。つまり、日は 1 から 31 の間、月は 1 から 12 の間でなければなりません。

あるタイプの入力に対しては機能していますが、別の入力とは一致しません。これが私のコードです:

#!/usr/bin/env python
from sys import stdin
from re import compile

myFormat = compile(r'(?=([0-2]\d|3[0-1])-(0\d|1[0-2])-(201[3-5]))' )
print myFormat.findall(stdin.readline())

入力 1:

777-444---21-12-2013-12-2013-12-2013---444-777

出力:

[('21', '12', '2013'), ('13', '12', '2013'), ('13', '12', '2013')]

ここまでは順調ですね。しかし、入力がある場合:

0012-10-2012-10-2012

それは何も一致しません。正しい出力は次のようになります。

[('12', '10', '2012'), ('12', '10', '2012')]

これを行うための正しい正規表現を見つけるのを手伝ってください

編集

2012 年から 2015 年までの年だけを一致させたいだけです。

4

1 に答える 1

3

正規表現を次のように変更した場合:

myFormat = compile(r'(?=([0-2]\d|3[0-1])-(0\d|1[0-2])-(201[2-5]))' )

それは機能します(最後[3-5]を に変更するだけ[2-5]です)。現在、あなたが持っているため、そうではありません:

201[3-5]

年の部分なので、2012 と一致しません。

有効性を確認する場合:

from sys import stdin
from re import compile
from datetime import datetime
myFormat = compile(r'(?=([0-2]\d|3[0-1])-(0\d|1[0-2])-(201[2-5]))' )
str1=("0012-10-2012-10-2012", "0031-02-2012");
for s in str1:
    for date in myFormat.findall(s):
        (d,m,y) = map(int, date)
        try:
           datetime(y,m,d)
           print date
        except: pass
于 2013-05-24T04:01:44.953 に答える