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

Python如何用re正则按顺序替换文件中重复的DateTime时间字段

问题原因

你当前的写法存在两个问题:

  1. 每次循环都是基于原始的filedata做全量替换,没有保留上一轮的替换结果,每次生成的new变量都会覆盖上一轮的结果
  2. re.sub默认会替换所有匹配到的内容,所以每轮循环都会把全部DateTime条目都改成当前的date_time_list[i],最后一轮循环自然所有条目都变成了列表最后一个值

解决方法

方案1:使用re.sub回调函数(更简洁高效)

把待替换的时间列表转成迭代器,每次匹配到目标内容就从迭代器里按顺序取一个值用,示例完整代码:

import re
from datetime import datetime, timedelta

def time_range(number_of_entries):
    all_time_objects = []
    # 如果需要固定起始时间,可把下面的datetime.now()替换为指定时间解析结果
    # 示例:all_time_objects.append(datetime.strptime('14-Oct-21  16:00:00', '%d-%b-%y  %H:%M:%S'))
    all_time_objects.append(datetime.now())
    # 原函数会多生成1个时间,此处调整循环次数匹配条目数
    for i in range(number_of_entries - 1):
        now_time = all_time_objects[i]
        now_time += timedelta(minutes=3)
        all_time_objects.append(now_time)
    formatted_time_list = [datetime.strftime(i,'%d-%b-%y  %H:%M:%S') for i in all_time_objects]
    return formatted_time_list

pattern = r'[\w].* = [\d]{2}-[\w]*-[\d]{2}.*[\d]{2}:[\d]{2}:[\d]{2}'
# 按实际匹配到的条目数传参,此处示例为3
date_time_list = time_range(3)
time_iter = iter(date_time_list)

src_file = "你的源文件路径"
with open(src_file, 'r') as src:
    filedata = src.read()

# 回调函数每次匹配到就取迭代器的下一个值
new_filedata = re.sub(pattern, lambda x: f'DateTime = {next(time_iter)}', filedata)

# 写入结果到文件
with open("输出文件路径", 'w') as f:
    f.write(new_filedata)

方案2:每次仅替换1个匹配项

如果不想用回调函数,可以给re.sub加count=1参数,每次只替换第一个匹配到的内容,循环处理即可:

# 替换原有循环逻辑
filedata = src.read()
for dt in date_time_list:
    # count=1 表示仅替换第一个匹配项
    filedata = re.sub(pattern, f'DateTime = {dt}', filedata, count=1)
new_filedata = filedata

内容的提问来源于stack exchange,提问作者Pranav Shah

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 09:06:03