【问题标题】:How do I limit the user from entering the wrong format for my time field如何限制用户为我的时间字段输入错误的格式
【发布时间】:2021-11-04 22:35:30
【问题描述】:

我已经在堆栈溢出上搜索了这个问题,但没有找到对我有帮助或根本不理解它们的东西。我想要的是一种方式来确认用户已经以以下格式输入时间hh:mm-hh:mm。例如:13:30-14:30。我不介意格式是 12 小时或 24 小时。也需要限制时间,从某种意义上说,分钟不应超过 59,小时不应超过 23。我见过使用正则表达式的解决方案,我也看过官方文档,但我觉得很难理解。因此,如果有人使用正则表达式作为答案,只要答案解释了正则表达式的含义,我不介意接受它。

pattern=r'[0-2][0-9]:[0-5][0-9]-[0-2][0-9]:[0-5][0-9]'
这是我的尝试,但很明显,这有很多错误。根据这个表达式,
29:58-29:59
是一个有效时间,当然不是。

【问题讨论】:

  • @anubhava 我在上面的问题中添加了我的尝试。

标签: python regex datetime time re


【解决方案1】:

正则表达式只会让它变得更复杂。如果时间正确,请改用time.strptime() 解析。使用time模块,您可以高度自定义它以读取12h或24h格式,读取字符串“AM”或“PM”等。

如果您还想验证第二次是否大于第一次,您也可以轻松使用time 模块中的功能来执行此操作。

import time


for data in [
    "13:30-14:30",
    "13:61-14:30",
    "13:30-14:99",
    "00:00-23:59",
    "00:0023:59",
    "XY:10-12:30",
    "01:44-06:00",
    "-11:10-12:30",
    "11:10-12:30",
    "26:10-34:12",
]:
    print(data)

    # Parse as 24h format
    try:
        start_time, _, end_time = data.partition("-")
        start_time = time.strptime(start_time, "%H:%M")
        end_time = time.strptime(end_time, "%H:%M")
    except Exception as error:
        print("\tThe time is invalid in 24h format!")
    else:
        print("\tThe time is valid in 24h format")

    # Parse as 12h format
    try:
        start_time, _, end_time = data.partition("-")
        start_time = time.strptime(start_time, "%I:%M")
        end_time = time.strptime(end_time, "%I:%M")
    except Exception as error:
        print("\tThe time is invalid in 12h format!")
    else:
        print("\tThe time is valid in 12h format")

输出:

13:30-14:30
    The time is valid in 24h format
    The time is invalid in 12h format!
13:61-14:30
    The time is invalid in 24h format!
    The time is invalid in 12h format!
13:30-14:99
    The time is invalid in 24h format!
    The time is invalid in 12h format!
00:00-23:59
    The time is valid in 24h format
    The time is invalid in 12h format!
00:0023:59
    The time is invalid in 24h format!
    The time is invalid in 12h format!
XY:10-12:30
    The time is invalid in 24h format!
    The time is invalid in 12h format!
01:44-06:00
    The time is valid in 24h format
    The time is valid in 12h format
-11:10-12:30
    The time is invalid in 24h format!
    The time is invalid in 12h format!
11:10-12:30
    The time is valid in 24h format
    The time is valid in 12h format
26:10-34:12
    The time is invalid in 24h format!
    The time is invalid in 12h format!

有关可能的格式,请参阅:

【讨论】:

  • 是否也可以为 12 小时格式执行此操作。您上面的解决方案有效,但我只是想知道它是否可能。
  • 是的,我更新了我的答案。您可以解析我在答案中链接的strptime 文档中可以看到的任何内容。
【解决方案2】:

如果您正在寻找正则表达式解决方案,那么此正则表达式可能适合您:

^(?:[01]\d|2[0-3]):(?:[0-5]\d)-(?:[01]\d|2[0-3]):(?:[0-5]\d)$

RegEx Demo

正则表达式详细信息:

  • ^:开始
  • (?:[01]\d|2[0-3])::从 0023 的小时数,后跟 :
  • (?:[0-5]\d)-:分钟从00 tp 59 后跟-
  • (?:[01]\d|2[0-3])::从 0023 的小时数,后跟 :
  • (?:[0-5]\d):分钟从00 tp 59
  • $:结束

【讨论】:

  • "?:" 的用途是什么,即 (?:[01]\d|2[0-3]) 和 ([01]\d|2[0-3] 中的差异)
  • (?:...) 是一个非捕获组。如果我们不想捕获某些东西,使用非捕获组会更有效。
  • 我会使用日期时间 API,如接受的答案所示。然而,这个正则表达式解决方案非常棒。
【解决方案3】:

Niel Godfrey Ponciano 的回答解决了这个问题,但我会做出以下修改:

user_input = user_input.replace(' ', '')

您不希望时间解析因空格而失败,也不应因小错误而困扰用户。

由于更多的便利功能,我个人会选择datetime.strptime() 而不是time.strptime()。不过后者没什么问题。

【讨论】:

  • 谢谢,我确实遇到了这个问题,当我遇到错误时,我使用了相同的代码。我已投票,以便其他可能面临相同问题的人可以从您的修改中受益。
【解决方案4】:

我们也可以在这里使用正则表达式:

([01][0-9]|[2][0-3]):[0-5][0-9]-([01][0-9]|[2][0-3]):[0-5][0-9]

演示:https://regex101.com/r/EeImIa/1

【讨论】:

  • 这种模式的缺点是我们无法验证结束时间是否大于第一个字符串。
【解决方案5】:

使用此模式(24 小时格式):/^([0-1][0-9]|2[0-4])\:([0-5][0-9])\-([0-1][0-9]|2[0-3])\:([0-5][0-9])$/g

模式说明:

小时:如果第一个数字是 0 或 1,那么第二个数字可以在 0-9 之间(如 01、09、18 和 ...),或者如果第一个数字是 2,那么第二个数字可以在 0-3 之间(如 20、21、22 和 23)

分钟数:如果第一个数字介于 0-5 之间,则第二个数字可以介于 0-9 之间(与所有分钟数一样)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-02-07
    • 1970-01-01
    • 1970-01-01
    • 2019-03-27
    • 1970-01-01
    • 1970-01-01
    • 2022-08-15
    • 1970-01-01
    相关资源
    最近更新 更多