如何用正则表达式匹配带可选分隔符的年月字符串?
解决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
相关产品推荐
相关产品推荐

