如何用Python修复含空格或换行的损坏XML标签?
修复XML损坏标签的Python方案
原代码的问题
- re.sub未生效:
re.sub()会返回修改后的新字符串,不会原地修改原data变量,你没把返回值重新赋值给data,所以看不到修改效果。 - 遍历方式冗余:用
iterator变量手动计数完全没必要,直接用zip()同时配对原标签和修复后的标签更简洁。 - 正则匹配范围有限:原正则只匹配了包含换行的标签,但有些损坏标签可能只有空格没有换行,或者换行位置不在你预设的位置,匹配不全。
更简洁的Pythonic实现
直接用re.sub()的回调函数,一次性匹配所有损坏的标签并完成修复,不用分两步处理:
import re with open('file.xml', 'r') as file: data = file.read() # 定义修复函数:清除标签内的换行和空格 def fix_tag(match): tag = match.group(0) return tag.replace('\n', '').replace(' ', '') # 匹配所有<开头、>结尾,且中间包含换行或空格的标签 fixed_data = re.sub(r'<[^>]*[\n ][^>]*>', fix_tag, data) # 保存修复后的内容 with open('fixed_file.xml', 'w') as file: file.write(fixed_data)
代码说明
- 正则
r'<[^>]*[\n ][^>]*>':匹配所有<开头、>结尾,且中间存在换行或空格的标签,覆盖了换行拆分、插入空格的损坏情况。 - 回调函数
fix_tag:对每个匹配到的损坏标签,直接清除其中的换行和空格,返回修复后的标签。 - 直接通过一次
re.sub()完成所有替换,代码更简洁高效,避免了多次循环的冗余操作。
验证替换过程(可选)
如果需要查看替换前后的对比,可以在替换前先打印匹配到的内容:
matches = re.findall(r'<[^>]*[\n ][^>]*>', data) for match in matches: fixed = match.replace('\n', '').replace(' ', '') print(f"原标签:{repr(match)}\n修复后:{repr(fixed)}\n")
内容的提问来源于stack exchange,提问作者Johnny_the_Pickle
相关产品推荐
相关产品推荐

