如何用正则表达式提取三种指定格式的日期?
提取目标日期的正则方案
我来帮你搞定这个日期提取的需求!先梳理下你要匹配的三种日期格式:
- 带点的完整月份:
September. 21, 2012(month. dd, yyyy) - 无点的完整月份:
July 25, 1998(month dd, yyyy) - 月份缩写:
Oct 18, 1980(mmm dd, yyyy)
针对这三种格式,我们可以写一个精准覆盖所有情况的正则表达式,下面是具体方案:
正则表达式解析
(?:January|February|March|April|May|June|July|August|September|October|November|December)\.?\s+\d{1,2},\s+\d{4}|Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec\s+\d{1,2},\s+\d{4}
拆解下各部分的作用:
(?:January|...|December):非捕获分组,匹配所有完整月份名(用?:避免生成多余的捕获组)\.?:匹配可选的点号,兼容带点的完整月份(比如September.)\s+:匹配一个或多个空格,处理月份和日期之间的空格\d{1,2}:匹配1-2位的日期数字(不管是5还是21都能匹配),\s+:匹配逗号加一个或多个空格,对应日期和年份之间的分隔\d{4}:匹配4位年份数字|Jan|Feb|...|Dec:并列匹配所有3位月份缩写,覆盖第三种格式
Python 实战示例
用Python的re模块直接提取所有符合格式的日期:
import re text = 'This is my text I will search through for patterns September. 21, 2012. As well as July 25, 1998 and a date like Oct 18, 1980' # 编译正则表达式 date_regex = re.compile(r'(?:January|February|March|April|May|June|July|August|September|October|November|December)\.?\s+\d{1,2},\s+\d{4}|Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec\s+\d{1,2},\s+\d{4}') # 提取所有匹配的完整日期 matched_dates = date_regex.findall(text) print(matched_dates) # 输出结果: ['September. 21, 2012', 'July 25, 1998', 'Oct 18, 1980']
补充小提示
如果你的文本里还有其他月份变体(比如用Sept代替Sep),直接在缩写列表里加上对应的选项就行;如果需要严格限制日期为01-31的合法范围,得再细化正则,但日常场景下\d{1,2}已经足够覆盖大多数情况啦。
内容的提问来源于stack exchange,提问作者metalray
相关产品推荐
相关产品推荐

