正则匹配需求:仅提取2位/4位的成对年份数字
问题需求
给定以下字符串:
myStr1 = 'new classic 11111 new classic 2020 year report' myStr2 = '2020 year - 2022 year report' myStr3 = '20 year - 2022 year report' myStr4 = '2020 to 2022 report'
需要实现:
- 从
myStr2、myStr3、myStr4中提取两个2位或4位的年份数字 - 不匹配
myStr1(该字符串包含非2/4位的数字11111,且无符合规则的年份配对)
原正则re.search('(\d{2}|\d{4})(year?)(-|\w+)(\d{2}|\d{4})(year?)', myStr1)会错误从11111中截取11,需要修正。
修正后的正则表达式
使用以下正则可满足需求:
re.search(r'\b(\d{2}|\d{4})\s*(year)?\s*(?:-|to)\s*(\d{2}|\d{4})\s*(year)?\b', target_str)
关键修改说明
- 单词边界
\b:确保匹配的数字是独立单词,不会从更长的数字(如11111)中截取片段,彻底避免误匹配。 - 精准限定连接符:将原正则的
-|\w+改为-|to,只匹配指定的连接符,避免匹配无关单词。 - 可选空白符
\s*:兼容数字、year、连接符之间的空格差异,适配不同格式的字符串。 - 非捕获组
(?:...):连接符部分用非捕获组,避免提取不需要的连接符内容。
测试结果
myStr1:无匹配结果,符合要求myStr2:提取分组结果为('2020', 'year', '2022', 'year')myStr3:提取分组结果为('20', 'year', '2022', 'year')myStr4:提取分组结果为('2020', None, '2022', None)
内容的提问来源于stack exchange,提问作者Rinne Tsujikubo
相关产品推荐
相关产品推荐

