求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
相关产品推荐
相关产品推荐

