Python3正则表达式:搜索"12 Apr 2018"格式字符串并转为date对象
在Python中匹配"DD MMM YYYY"格式字符串并转换为date对象
我来一步步帮你搞定这个需求——从字符串里找出像"12 Apr 2018"这种格式的日期,再把它们转换成Python的date对象,其实很简单,分几步来:
1. 导入必要的模块
首先得导入两个核心工具:re模块用来做正则搜索,datetime模块用来处理日期转换。
import re from datetime import datetime
2. 编写匹配目标格式的正则表达式
我们要匹配的是两位数字日期 + 空格 + 三个字母的月份缩写 + 空格 + 四位数字年份的格式。对应的正则可以这么写:
pattern = r'\b(\d{2}) ([A-Z][a-z]{2}) (\d{4})\b'
\b是单词边界,避免匹配到比如"112 Apr 2018"这种带多余数字的情况(\d{2})捕获两位日期数字([A-Z][a-z]{2})捕获首字母大写、后面两位小写的标准月份缩写(比如Apr、Jan)(\d{4})捕获四位年份数字
如果想兼容小写的月份缩写(比如"12 apr 2018"),可以给正则加上忽略大小写的标志:
pattern = r'\b(\d{2}) ([a-zA-Z]{3}) (\d{4})\b' match_obj = re.search(pattern, text, flags=re.IGNORECASE)
3. 搜索并提取匹配的日期字符串
假设你有一段包含目标日期的文本,比如:
text = "Meeting scheduled on 12 Apr 2018, follow-up on 25 Dec 2018."
提取单个匹配
用re.search()找第一个匹配的结果:
match = re.search(pattern, text) if match: day, month, year = match.groups() date_str = f"{day} {month} {year}" print(f"找到匹配的日期字符串:{date_str}")
提取所有匹配
如果文本里有多个符合格式的日期,用re.findall()一次性提取所有:
all_matches = re.findall(pattern, text) print(f"所有匹配的日期组:{all_matches}") # 输出:[('12', 'Apr', '2018'), ('25', 'Dec', '2018')]
4. 将字符串转换为date对象
用datetime.strptime()方法来解析日期字符串,指定格式符%d %b %Y:
%d:两位数字的日期(01-31)%b:三个字母的月份缩写(Jan-Dec)%Y:四位数字的年份(比如2018)
然后调用.date()方法得到纯date对象(不带时间):
单个转换示例
if match: day, month, year = match.groups() date_obj = datetime.strptime(f"{day} {month} {year}", "%d %b %Y").date() print(f"转换后的date对象:{date_obj}") print(f"对象类型:{type(date_obj)}") # 输出: # 转换后的date对象:2018-04-12 # 对象类型:<class 'datetime.date'>
批量转换所有匹配
date_objects = [] for match in all_matches: day, month, year = match try: date_obj = datetime.strptime(f"{day} {month} {year}", "%d %b %Y").date() date_objects.append(date_obj) except ValueError: # 处理无效日期的情况,比如"30 Feb 2018" print(f"无效日期:{day} {month} {year}") print(f"所有转换后的date对象:{date_objects}") # 输出:[datetime.date(2018, 4, 12), datetime.date(2018, 12, 25)]
注意事项
- 如果你的系统本地语言不是英文,
%b可能无法识别英文月份缩写,这时候可以指定英文本地化环境:import locale locale.setlocale(locale.LC_TIME, 'en_US.UTF-8') - 加上
try-except块很重要,避免因为正则匹配到了格式正确但实际无效的日期(比如31号在4月)导致程序崩溃。
内容的提问来源于stack exchange,提问作者Gaurav Chavan




