You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动