Python re.sub()处理XML多余空格失效问题求助
处理XML文件多余空格的正则问题
问题场景
生成的XML文件包含大量多余空格,导致解析错误,需要删除:
- 每个
<前的所有空格 - 每个
>后的所有空格
尝试用Python的re.sub()处理,第一个正则生效,但第二个完全不匹配。
原代码
import re import os f2 = open(r"C:\output_clean.xml", "a") lines = open(r"C:\output.xml", "r").readlines() for line in lines: line = re.sub(r"\s*<", "<", line) line = re.sub(r">\s*", ">", line) f2.write(line) f2.close()
原XML片段
<?xml version="1.0"?><ImportExportG1> <DOCVENTE> <TIPDOC> B1 </TIPDOC> <RAGBOL> A </RAGBOL>...
预期结果
<?xml version="1.0"?><ImportExportG1><DOCVENTE><TIPDOC>B1</TIPDOC><RAGBOL>A</RAGBOL>...
实际结果
<?xml version="1.0"?><ImportExportG1><DOCVENTE><TIPDOC> B1</TIPDOC><RAGBOL> A</RAGBOL>...
问题原因
原代码用readlines()按行读取文件,若>和后续的空格/文本不在同一行(比如被换行分隔),第二个正则>\s*只能匹配当前行内>后的空格,无法跨行匹配换行符+空格的组合,导致标签内的空格无法被删除。同时,追加模式("a")写入会导致多次运行重复输出内容。
解决方案
方案1:正则批量处理(适合无保留文本空格需求)
一次性读取整个文件内容,避免按行处理的局限性,同时用with语句自动管理文件资源:
import re with open(r"C:\output.xml", "r", encoding="utf-8") as input_file, \ open(r"C:\output_clean.xml", "w", encoding="utf-8") as output_file: # 一次性读取全部XML内容 xml_content = input_file.read() # 删除<前的所有空格 xml_content = re.sub(r"\s*<", "<", xml_content) # 删除>后的所有空格(支持跨换行匹配) xml_content = re.sub(r">\s*", ">", xml_content) # 写入处理后的内容 output_file.write(xml_content)
方案2:用XML解析库处理(需保留合法文本空格)
如果XML中存在需要保留的文本空格,建议用专业XML库精准清理标签间空格,避免正则误删内容:
import xml.etree.ElementTree as ET from xml.etree.ElementTree import tostring # 解析XML文件 tree = ET.parse(r"C:\output.xml") root = tree.getroot() # 递归清理元素的文本和尾部空格 def clean_whitespace(element): if element.text: element.text = element.text.strip() if element.tail: element.tail = element.tail.strip() for child in element: clean_whitespace(child) clean_whitespace(root) # 写入处理后的XML with open(r"C:\output_clean.xml", "wb") as output_file: output_file.write(tostring(root, encoding="utf-8"))
内容的提问来源于stack exchange,提问作者Takeda925
相关产品推荐
相关产品推荐

