为什么zfill无法在python中的字符串对象上工作?

时间:2019-07-09 15:44:42

标签: python python-3.x string

我正在尝试将传递给此函数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都将无法工作。我检查了日期部分是否为字符串,是否为字符串。我完全迷路了。

2 个答案:

答案 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