Python regex sub方法下while循环内变量自增后Excel替换异常问题
问题根因
- 你全程在同一个内存中的工作簿
wb和工作表ws对象上做修改:第一次循环已经把指定范围内所有符合规则的两位数字替换成了1位的1,后续循环的正则规则\d\d(?=\*)仅匹配两位数字,已经找不到可匹配的内容,因此后续所有替换操作都不会生效 - 你每次循环仅做了保存文件的操作,没有重新加载原始的Excel文件作为修改基底,所有修改都是在第一次替换后的结果上叠加,自然所有文件的替换值都是第一次的1
修复方案
每次进入while循环时,都重新从原始Excel文件加载工作簿和工作表对象,保证每次替换都是基于原始内容执行的,不会受上一次循环修改的影响。
修复后代码
import re from openpyxl import load_workbook # 替换为你自己的原始Excel文件路径 ORIGIN_FILE = "你的原始文件.xlsx" i = 1 while i < 5: a = i # 每次循环重新加载原始文件,保证修改基底一致 wb = load_workbook(ORIGIN_FILE) # 替换为你实际要操作的工作表名称 ws = wb["Sheet1"] for row in ws.iter_rows(min_row=18, min_col=2, max_col=91, max_row=41): for cell in row: cv = cell.value if not cv: continue formula_regex = re.compile(r'\d\d(?=\*)') formula = formula_regex.sub(f"{a}", str(cv)) cell.value = formula filename = f'sw_file_{a}.xlsx' wb.save(filename) i += 1
额外优化建议
- 正则表达式的编译可以放到循环外,不需要每次循环都重复生成正则对象,提升执行效率
- 增加空单元格判断,避免遇到空值时报错
- 把原始文件路径、工作表名称提取为变量,后续修改更方便
内容的提问来源于stack exchange,提问作者Ejike
相关产品推荐
相关产品推荐

