从类XML格式midx文件提取JPG路径失败,请求排查问题
问题排查与解决方案
原代码的问题点
- 正则语法错误:Python的
re.compile不需要用/包裹模式(这是JavaScript的写法),直接传入正则字符串即可。 - 捕获逻辑失效:原正则
(\S\w*)*无法匹配完整文件路径——路径中的下划线、点号(除JPG后缀外)都会被排除,且重复捕获组只会保留最后一次匹配的片段,无法得到完整路径。 - 无属性限定:没有锚定到
filenames属性,可能误匹配其他位置的JPG路径。 - 逐行读取局限:若
dataset标签跨多行,逐行读取会导致匹配失败。
修正方案1:优化正则表达式
直接匹配filenames属性内的JPG路径,读取整个文件内容避免跨行问题:
import re # 读取整个文件内容,处理可能的跨行标签 with open('visus8.midx', 'r') as f: file_content = f.read() # 匹配filenames属性中以.JPG结尾的路径,兼容大小写 pattern = re.compile(r'filenames="([^"]+\.JPG)"', re.IGNORECASE) jpg_paths = pattern.findall(file_content) for path in jpg_paths: print(path)
正则说明:
filenames=":精确匹配属性名和开头双引号([^"]+\.JPG):捕获双引号内所有非引号字符,确保路径完整,且以.JPG结尾re.IGNORECASE:兼容小写.jpg后缀的情况
修正方案2:用XML解析库(更可靠)
由于midx是类XML格式,用专业的XML解析库比正则更稳定,能自动处理标签结构、属性转义等情况:
import xml.etree.ElementTree as ET # 解析midx文件 tree = ET.parse('visus8.midx') root = tree.getroot() # 遍历所有dataset标签,提取filenames属性 for dataset_tag in root.findall('.//dataset'): filename = dataset_tag.get('filenames') if filename and filename.endswith(('.JPG', '.jpg')): print(filename)
这个方法无需关注复杂的字符串匹配,直接通过XML节点和属性名提取内容,容错性更强。
内容的提问来源于stack exchange,提问作者Siddharth
相关产品推荐
相关产品推荐

