如何用re.sub()捕获组提取并重组字符串中的时间日期信息?
Python正则替换修复:时间日期格式重组
问题说明
原代码中re.sub()的第二个参数误用了print(lambda m: print(m[1])),完全无法实现格式转换需求。我们需要替换为自定义处理逻辑,将输入字符串里的日期+时间区间,转换为指定格式:(YYYY_-_MM_-_DD hh:mm am/pm_--_hh:mm am/pm)。
修复后的代码
import re def format_time_date(match): # 提取匹配到的日期、开始时间、结束时间 formatted_date = match.group(1).replace('-', '_-_') start_time = match.group(2) end_time = match.group(3) # 拼接成目标格式 return f"({formatted_date} {start_time}_--_{end_time})" # 正则规则:匹配日期+开始时间+分隔符+结束时间的结构 pattern = r'(\d{4}-\d{2}-\d{2})\s+(\d{1,2}:\d{2}\s+(?:am|pm))\s+-\s+(\d{1,2}:\d{2}\s+(?:am|pm))' # 测试用例 test_inputs = [ "2023-10-05 09:00 am - 11:00 am", "2024-02-29 2:30 pm - 4:15 pm", "2023-12-25 12:00 am - 12:00 pm", "2024-01-01 10:00 pm - 11:59 pm" ] for input_str in test_inputs: result = re.sub(pattern, format_time_date, input_str) print(result)
输出结果
(2023_-_10_-_05 09:00 am_--_11:00 am) (2024_-_02_-_29 2:30 pm_--_4:15 pm) (2023_-_12_-_25 12:00 am_--_12:00 pm) (2024_-_01_-_01 10:00 pm_--_11:59 pm)
关键细节
- 正则表达式拆解:
(\d{4}-\d{2}-\d{2}):匹配YYYY-MM-DD格式的日期,作为第一个分组(\d{1,2}:\d{2}\s+(?:am|pm)):匹配带am/pm的时间(支持1位或2位小时),作为第二、第三个分组\s+-\s+:匹配时间区间之间的分隔符(前后允许任意空格)
- 替换逻辑:直接将自定义函数传给
re.sub(),函数内部处理分组内容,生成目标格式字符串,无需多余的print或嵌套lambda操作
内容的提问来源于stack exchange,提问作者Matt095
相关产品推荐
相关产品推荐

