Python如何用re正则按顺序替换文件中重复的DateTime时间字段
问题原因
你当前的写法存在两个问题:
- 每次循环都是基于原始的
filedata做全量替换,没有保留上一轮的替换结果,每次生成的new变量都会覆盖上一轮的结果 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
相关产品推荐
相关产品推荐

