我正在尝试将传递给此函数YYYY-M?M-D?D
的日期转换为一个整数和一个列表的元组,日期的每个部分都具有单独的元素。由于我是如何接收数据以及如何重复使用数据的,因此我认为我需要在日期的每个部分使用zfill()
来附加0以保持YYYY-MM-DD
格式。
def parse_date(date: str) -> tuple:
"""
Converts date-string into a tuple, which contains an integer and a split date
:param date: A date-string in the format 'YYYY-MM-DD'
:rtype: tuple
"""
split_date = date.split('-')
regex_arr = [
r"(\d{4}?)", r"(0[0-9]|1[0-2])", r"(0[0-9]|1[0-9]|2[0-9]|3[0-1])"
]
for date_section, regex_section in zip(split_date, regex_arr):
compiled_regex = re.compile(regex_section)
is_date = compiled_regex.match(date_section)
if not is_date:
if len(split_date[0]) != 4:
raise SyntaxError(
f"Invalid Syntax: The date inputed ({date}) should be in YYYY-MM-DD format"
)
split_date.replace(date_section, date_section.zfill(2))
date_section = date_section.zfill(2)
is_date = compiled_regex.match(date_section)
if not is_date:
raise SyntaxError(
f"Invalid Syntax: The date inputed ({date}) should be in YYYY-MM-DD format"
)
无论出于何种原因,zfill都将无法工作。我检查了日期部分是否为字符串,是否为字符串。我完全迷路了。
答案 0 :(得分:0)
非常感谢Kevin。
基本上,我需要枚举zip并使用索引值来更新列表 这是代码:
setState
我的大失误
答案 1 :(得分:0)
您的问题是拆分后没有重新分配。
对于日期时间验证,这看起来非常“庞大”-问题已在datetime.strptime
(link)内部解决:
def parse_date(date: str) -> tuple:
from datetime import datetime
try:
# ensure it is a valid date, i.e. no "1234-56-78"
d = datetime.strptime(date,"%Y-%m-%d")
# ensure leading zeros are present if needed - if not date is shorter 10 char's
if len(date) < 10:
raise ValueError
except ValueError:
raise SyntaxError(f"Invalid Syntax: The date inputed ({date}) should be " \
"in YYYY-MM-DD format" )
# return parts as parsed integers
return d.year,d.month,d.day
测试:
print(parse_date("1234-10-11"))
try:
parse_date("1234-1-11")
except SyntaxError as s:
print(s)
try:
parse_date("1234-22-11")
except SyntaxError as s:
print(s)
输出:
(1234, 10, 11)
Invalid Syntax: The date inputed (1234-1-11) should be in YYYY-MM-DD format
Invalid Syntax: The date inputed (1234-22-11) should be in YYYY-MM-DD format