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

如何用正则表达式匹配带可选分隔符的年月字符串?

解决Python正则提取年份和月份的匹配问题

你的问题核心是正则没同时覆盖「年份+连续两位月份」和「年份+非数字分隔符+1-2位月份」这两种场景,单独测月份有效是因为没结合年份的上下文。

优化后的正则表达式

直接使用能覆盖两种场景的正则,同时确保年份和月份的捕获:

import re

pattern = r'(\d{4})(?:(\d{2})|[^\d](\d{1,2}))'

正则解析

  • (\d{4}):捕获4位数字的年份,作为第一个分组
  • (?:...):非捕获组,用来包裹两种月份场景的分支
    • (\d{2}):分支1,捕获连续的两位数字月份(对应202301这类格式)
    • |[^\d](\d{1,2}):分支2,匹配任意非数字分隔符后,捕获1-2位数字的月份(对应2023-1、2023-01这类格式)

提取逻辑示例

遍历测试用例,合并两个月份分组的结果(因为两种场景只会命中其中一个分组):

test_cases = ['202301', '2023-1', '2023-01', '2023/12', '2023.9']

for case in test_cases:
    match = re.search(pattern, case)
    if match:
        year = match.group(1)
        # 取第二个或第四个分组的结果,哪个有值用哪个
        month = match.group(2) or match.group(3)
        print(f"{case} → 年份:{year},月份:{month}")

可选优化:校验月份有效性

如果需要确保提取的月份是1-12的有效值,可以把月份部分替换为有效范围的正则:

valid_pattern = r'(\d{4})(?:((0?[1-9]|1[0-2]))|[^\d]((0?[1-9]|1[0-2])))'

内容的提问来源于stack exchange,提问作者Kohei Sugimura

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 22:15:55