《Automate The Boring Stuff》第七章习题:如何优化日期检测正则?
优化DD/MM/YYYY日期检测的正则表达式
嘿,我来帮你精简这个日期校验的正则!你的原表达式功能是达标的,但确实有不少冗余的地方,咱们一步步优化:
核心优化方向
- 去掉所有不必要的
{1}:正则中单个字符默认匹配一次,加{1}纯属多余,只会增加表达式长度。 - 简化分组逻辑:把日、月的匹配规则拆分成更直观的分支,减少嵌套分组,提升可读性。
优化后的正则表达式
r"^(0[1-9]|[12]\d|3[01])\/(0[1-9]|1[012])\/[12]\d{3}$"
拆解说明
- 日部分
0[1-9]|[12]\d|3[01]0[1-9]:匹配01-09的日期(个位数前置零)[12]\d:匹配10-29的日期3[01]:匹配30、31的日期
- 月部分
0[1-9]|1[012]0[1-9]:匹配01-09的月份(个位数前置零)1[012]:匹配10、11、12这三个月份
- 年部分
[12]\d{3}- 直接匹配1000-1999(
1\d{3})和2000-2999(2\d{3})的年份,逻辑清晰且简洁。
- 直接匹配1000-1999(
额外说明
如果需要更严谨的日期校验(比如区分二月的天数、30天的月份),纯正则其实很难完美处理——毕竟涉及闰年判断、月份天数差异等复杂逻辑。不过按照《Automate The Boring Stuff》第七章这道题的要求,上面的优化版本已经完全满足需求,而且比你的原表达式简洁得多、可读性更强。
内容的提问来源于stack exchange,提问作者AlfaLobster
相关产品推荐
相关产品推荐

