如何使用模块 Re 调整 python 中的 'the time'

How can I adjust 'the time' in python with module Re

这是一个有趣的问题。 我试图在一些短语中找出合适的时间。 我使用 try-except 模块和 re 模块 但是我的代码有问题,无法处理一些难处理的短语

如上图所示,我输入的是荒唐时间1997-25-521996-42-120 它仍然可以输出答案。

def regular_time(time):
    """
    部分电影日期带有国家, 例如:'1994-09-10(加拿大)'
    正则提取日期
    """
    import re
    pattern = '^(([1-2]\d{3})-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1]))'
    try:
        matches = re.match(pattern, time, flags=0).group()
        return matches
    except Exception as e:
        try:
              pattern = '^(([1-2]\d{3})-(0[1-9]|1[0-2]))'
              matches = re.match(pattern, time, flags=0).group()+'-01'
              return matches
        except:
           try:
              pattern = '^(([1-2]\d{3}))'
              matches = re.match(pattern, time, flags=0).group() + '-01-01'
              return matches
           except:
              print('errors')
time='1996-12-58'
regular_time(time)

我该如何处理这个问题?非常感谢,如果你能帮我一个忙

Question: Default date from invalid datestring

使用 datetime 也处理 闰年 !

例如:

import re
from datetime import datetime

def regular_time(time):
    _t = time.split('-')
    # allways 3 itmes
    while len(_t) < 3:
        _t.append('01')

    # year month and day ranges
    ymd = [(range(1900, 2099), '1900'), 
           (range(1, 13), '01'),
           (range(1, 32), '01')
          ]

    # validate ranges
    for n in range(3):
        if not int(_t[n]) in ymd[n][0]:
            _t[n] = ymd[n][1]

    _time = '-'.join(_t)
    try:
        date = datetime.strptime(_time, '%Y-%m-%d')
        print('VALID:{} => {}'
              .format(time, date.strftime('%Y-%m-%d')))
    except ValueError as e:
        if "day is out of range for month" in e:
            print('{} for {}, change to 01'.format(e, time))
            _t[2] = '01'
            regular_time('-'.join(_t))
        else:
            print('INVALID[{}]:{}'.format(_time, e))

for time in ['1996', '1996-18', '2019-09-31', '2019-01-31', 
             '1996-12-58', '1997-25-52', '1996-42-120']:
    regular_time(time)

Output:

VALID:1996 => 1996-01-01
VALID:1996-18 => 1996-01-01
day is out of range for month for 2019-09-31, change to 01
VALID:2019-09-01 => 2019-09-01
VALID:2019-01-31 => 2019-01-31
VALID:1996-12-58 => 1996-12-01
VALID:1997-25-52 => 1997-01-01
VALID:1996-42-120 => 1996-01-01

测试 Python 3.6

您的测试用例 returns“1996-12-01”,即它达到了第二级 "try-except",因为它匹配正确的年月模式(第一个失败的原因日期是不切实际),然后它只是通过添加“-01”将其简化为该月的第一天。

如果你想让日期的所有部分都真实 - 不要覆盖原来的 "pattern"。但是第一步就失败了。