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

如何在文件处理中同时执行字符串替换与re.sub正则替换?

解决CSV转XML时的正则替换整合问题

你可以通过两种方式把正则替换整合到你的转换流程里,下面分别说明:

方法一:在逐行处理时直接应用正则(推荐)

既然你是逐行读取CSV并处理,最高效的方式就是在完成所有字符串替换后,立刻对当前行应用正则替换,再写入XML文件。这样不需要额外读写文件,内存占用也小,适合处理大文件。

修改你的代码如下:

import re

# 用with语句自动管理文件,无需手动close
with open("input.csv", "r") as text, open("output.xml","w") as x:
    for line in text:
        # 先执行所有字符串替换
        processed_line = line.replace("QWERT=", "<Doc3045 QWERT=\"") \
            .replace(",Date=", "\" Date=\"") \
            .replace("ABCDE,Tp,CD", "") \
            .replace("S,1,", "<Cli Tp=\"1\" ABCDE=\"S\" Cd=\"") \
            .replace(",", "\"/>")
        # 应用正则替换处理行尾的数字
        processed_line = re.sub(r'(\d$)', r'\1"/>', processed_line)
        # 将最终处理后的行写入文件
        x.write(processed_line)

为什么这样可行?

你的正则re.sub(r'(\d$)', r'\1"/>', line)是用来匹配行尾的数字,并在其后方添加闭合标签"/>。把它放在所有字符串替换之后,能确保之前的替换操作不会干扰正则的匹配逻辑,同时每一行处理完就直接写入,避免了后续重复读写文件的开销。

方法二:事后处理输出文件(适合小文件)

如果因为某些原因你想先完成所有字符串替换写入文件,再单独执行正则替换,可以重新打开输出文件,读取全部内容后做替换,再写回文件。不过这种方法需要把整个文件加载到内存,不适合大文件。

示例代码:

import re

# 第一步:完成初始字符串替换并写入文件
with open("input.csv", "r") as text, open("output.xml","w") as x:
    for line in text:
        processed_line = line.replace("QWERT=", "<Doc3045 QWERT=\"") \
            .replace(",Date=", "\" Date=\"") \
            .replace("ABCDE,Tp,CD", "") \
            .replace("S,1,", "<Cli Tp=\"1\" ABCDE=\"S\" Cd=\"") \
            .replace(",", "\"/>")
        x.write(processed_line)

# 第二步:读取输出文件并执行正则替换
with open("output.xml", "r+") as f:
    content = f.read()
    updated_content = re.sub(r'(\d$)', r'\1"/>', content, flags=re.MULTILINE)
    # 回到文件开头,写入更新后的内容并截断多余部分
    f.seek(0)
    f.write(updated_content)
    f.truncate()

注意这里要加上flags=re.MULTILINE,让$匹配每一行的结尾,而不是整个文件的结尾。

小提示

建议优先使用方法一,不仅效率更高,也更符合逐行处理的逻辑。处理完后可以打开输出的XML文件检查标签是否都正确闭合,确保格式符合要求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 12:57:57