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

求Python纯YYYY格式日期匹配正则表达式(排除其他日期格式)

嘿,这个问题我熟!要精准匹配纯YYYY格式的年份,同时排除那些和月、日绑定的完整日期,关键是要确保这个4位数字是独立存在的,不是其他日期结构的一部分。我给你整理了一个针对性的正则表达式,还有详细的解释和测试示例:

解决方案:纯YYYY年份匹配正则表达式

核心思路是用负向前后断言排除年份与月/日关联的情况,同时用单词边界确保匹配的是完整的4位数字年份。

正则表达式代码

import re

# 匹配纯YYYY格式年份,排除与月/日组合的日期
year_pattern = r'(?<!\b(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec|\d{1,2})[,. ])\b\d{4}\b(?!(?:[,. ]\d{1,2}|[,. ](?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec))\b)'

正则各部分解释

咱们拆开来看看每个部分的作用:

  • (?<!...):负向后行断言,确保匹配的年份前面没有这些内容:
    • \b(?:Jan|Feb|...|Dec):月份缩写(带单词边界,避免误匹配类似"January"里的"Jan"前缀)
    • \d{1,2}:1-2位数字(代表日期)
    • [,. ]:日期和年份之间常见的分隔符(逗号、点号、空格)
  • \b\d{4}\b:匹配独立的4位数字年份,\b是单词边界,确保不会匹配比如"19845"里的"1984"
  • (?!...):负向先行断言,确保匹配的年份后面没有这些内容:
    • [,. ]\d{1,2}:分隔符加1-2位日期数字
    • [,. ](?:Jan|Feb|...|Dec):分隔符加月份缩写

测试示例

我准备了几个测试用例,你可以直接运行验证效果:

test_texts = [
    'Train accident in 1984 had a heavy death toll',  # ✅ 匹配1984
    'One of the injured succumbed to injuries on Jun 10 1984',  # ❌ 不匹配1984(和月日绑定)
    'Sep 15, 1984 ....',  # ❌ 不匹配1984(和月日绑定)
    '1984 was a pivotal year for technology',  # ✅ 匹配1984
    'The final report was released in 2023',  # ✅ 匹配2023
    'We scheduled the meeting for 05/12/2023',  # ❌ 不匹配2023(属于mm/dd/yyyy格式)
    'The 1999 incident led to major changes, 2000 saw reforms',  # ✅ 匹配1999和2000
]

for text in test_texts:
    matches = re.findall(year_pattern, text)
    print(f"原文: {text}")
    print(f"匹配到的年份: {matches}\n")

扩展调整建议

如果你的需求有特殊情况,可以调整正则:

  • 支持月份全称:把月份部分改成(?:Jan(?:uary)?|Feb(?:ruary)?|Mar(?:ch)?|Apr(?:il)?|May|Jun(?:e)?|Jul(?:y)?|Aug(?:ust)?|Sep(?:tember)?|Oct(?:ober)?|Nov(?:ember)?|Dec(?:ember)?),这样既能匹配缩写也能匹配全称
  • 限制年份范围:比如只匹配1900-2099,把\d{4}替换成(?:19\d{2}|20\d{2})
  • 排除连字符连接的日期:如果要排除2023-04-15这种格式,把正则里的[,. ]改成[,.\- ],加入连字符作为分隔符

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:31:21