如何使用模块 Re 调整 python 中的 'the time'
How can I adjust 'the time' in python with module Re
这是一个有趣的问题。
我试图在一些短语中找出合适的时间。
我使用 try-except
模块和 re
模块
但是我的代码有问题,无法处理一些难处理的短语
如上图所示,我输入的是荒唐时间1997-25-52或1996-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"。但是第一步就失败了。
这是一个有趣的问题。
我试图在一些短语中找出合适的时间。
我使用 try-except
模块和 re
模块
但是我的代码有问题,无法处理一些难处理的短语
如上图所示,我输入的是荒唐时间1997-25-52或1996-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"。但是第一步就失败了。