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

基于动态日期格式从字符串提取日期(Python实现)

动态日期格式提取的Python实现

核心思路

将动态传入的strftime日期格式转换为对应正则表达式,先匹配出所有候选字符串,再通过datetime.strptime验证候选是否真的符合目标格式——这一步能避免正则误匹配无效日期(比如02-30-2023这类不存在的日期)。

实现代码

import re
from datetime import datetime

def extract_dates_by_format(input_str, date_format):
    # 映射strftime格式符号到正则片段
    format_to_regex = {
        '%Y': r'\d{4}',
        '%y': r'\d{2}',
        '%m': r'(0[1-9]|1[0-2])',
        '%d': r'(0[1-9]|[12]\d|3[01])',
        '%H': r'([01]\d|2[0-3])',
        '%M': r'[0-5]\d',
        '%S': r'[0-5]\d',
        # 补充格式中的字面分隔符
        '-': r'-',
        ':': r':',
        ' ': r' '
    }
    
    # 构建正则表达式
    regex_pattern = ''
    i = 0
    format_len = len(date_format)
    while i < format_len:
        if i < format_len - 1 and date_format[i] == '%':
            # 处理%开头的格式符
            key = date_format[i:i+2]
            regex_pattern += format_to_regex.get(key, re.escape(key))
            i += 2
        else:
            # 字面字符转义后加入正则
            regex_pattern += re.escape(date_format[i])
            i += 1
    
    # 匹配所有候选日期
    candidates = re.findall(regex_pattern, input_str)
    valid_dates = []
    
    # 验证候选并去重分组结果
    for candidate in candidates:
        if isinstance(candidate, tuple):
            candidate = ''.join(candidate)
        try:
            # 验证日期有效性
            datetime.strptime(candidate, date_format)
            valid_dates.append(candidate)
        except ValueError:
            continue
    return valid_dates

# 示例调用
input_str = 'this string has two dates 03-13-2023 08:09:16 and 2023-03-15 19:54:02'
target_format = '%m-%d-%Y %H:%M:%S'
print(extract_dates_by_format(input_str, target_format))
# 输出: ['03-13-2023 08:09:16']

关键细节说明

  • 格式映射扩展性:如果需要支持更多strftime格式(比如%b缩写月份、%A星期全名),只需在format_to_regex字典中补充对应的正则规则即可。
  • 正则安全处理:所有字面字符都会被re.escape转义,避免格式中的特殊字符(比如.、*)干扰正则语法。
  • 有效性校验:正则只能匹配格式的字符规则,无法判断日期逻辑有效性(比如2月30日),strptime的校验能补上这一漏洞。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 10:52:15