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

正则表达式r'[1900-2023]+'为何无法匹配1900-2023范围内的年份?

问题解析与解决方案

嘿,我来帮你搞懂这个正则表达式的问题~

为什么会出现奇怪的输出?

你写的正则r'[1900-2023]+'根本不是在匹配1900到2023的年份,这里的核心误区是对**正则字符类([])**的理解错误:

  • 字符类[1900-2023]的意思是:匹配单个字符,这个字符可以是 1、9、0,或者处于0-2范围的字符(也就是0、1、2),再或者2、3。总结下来,允许的单个字符是:0、1、2、3、9。
  • 后面的+表示匹配一个或多个连续的符合条件的字符。

那回到你的文本:

  • 2005里,前三个字符2、0、0都在允许的字符列表里,但第四个字符5不在,所以正则只匹配到200就截断了;
  • 08里的0符合条件,单独被匹配,后面的8不符合,跳过;
  • 2019的四个字符2、0、1、9都符合条件,所以被完整匹配。

这就是为什么输出是200、0、2019,而完整的2005没被匹配到。

正确匹配1900-2023年份的正则写法

要匹配四位数字且数值在1900到2023之间,我们需要分情况构建正则:

  1. 匹配1900-1999:19\d{2}(以19开头,后面跟任意两位数字)
  2. 匹配2000-2023:20(0\d|1\d|2[0-3])(以20开头,后面两位可以是00-09、10-19、20-23)

把这两部分用|合并,再加上单词边界\b(避免匹配到其他数字的一部分,比如12345里的2345),最终的正则可以写成:

import re

txt = 'Ted\'s date of birth is 5-6-2005 and he started college at 08-5-2019'
# 用非捕获组(?:...)避免findall返回冗余的分组内容
year_pattern = re.compile(r'\b(?:19\d{2}|20(?:0\d|1\d|2[0-3]))\b')
res = year_pattern.findall(txt)
for i in res:
    print(i)

运行这段代码,输出就是你预期的:

2005
2019

内容的提问来源于stack exchange,提问作者Mir Stephen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 06:58:02