正则表达式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之间,我们需要分情况构建正则:
- 匹配1900-1999:
19\d{2}(以19开头,后面跟任意两位数字) - 匹配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
相关产品推荐
相关产品推荐

