基于动态日期格式从字符串提取日期(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
相关产品推荐
相关产品推荐

