You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中校验ISO8601格式字符串有效性的技术问题

用Python的re模块校验ISO8601时长格式有效性

完全可以用re模块实现这类校验,核心是通过正则表达式匹配ISO8601时长格式的规则:

有效格式规则

  • 必须以大写P开头
  • 后续由「数字+时间单位」的组合构成,单位仅支持Y(年)、M(月)、D(日),顺序需遵循Y→M→D(可缺省中间或前面的单位,但不能乱序)
  • 每个单位前必须有至少1位阿拉伯数字,不能出现无数字的单位组合(比如MD)

正则表达式与校验代码

import re

def is_valid_iso8601_duration(s):
    # 正则规则:确保P开头,至少包含一个数字,且年/月/日部分符合格式
    pattern = r'^P(?=.*\d)(?:\d+Y)?(?:\d+M)?(?:\d+D)?$'
    return bool(re.fullmatch(pattern, s))

# 测试你的示例用例
test_samples = [
    ("P2Y6M10D", "有效"),
    ("P2Y10D", "有效"),
    ("P15D", "有效"),
    ("P2Y6MD", "无效"),
    ("2Y6M10D", "无效")
]

for sample, status in test_samples:
    check_result = "有效" if is_valid_iso8601_duration(sample) else "无效"
    print(f"{sample} - {check_result}")

代码说明

  • ^P:强制匹配字符串开头的大写P,排除无前缀的无效格式
  • (?=.*\d):正向预查,确保字符串中至少包含一个数字,避免仅输入P的无效情况
  • (?:\d+Y)?:可选的年部分,\d+匹配1位及以上数字,?:表示非捕获组(仅用于分组匹配,不保留捕获结果)
  • (?:\d+M)?、(?:\d+D)?:分别对应可选的月、日部分,规则与年部分一致
  • re.fullmatch:确保整个字符串完全匹配正则规则,避免部分匹配的误判

运行代码后,输出结果会和你给出的示例完全一致。

内容的提问来源于stack exchange,提问作者Максим Акулов

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 22:52:46