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,提问作者Максим Акулов
相关产品推荐
相关产品推荐

