正则表达式提取XML中符合条件的嵌套列表及标签名求助
嘿,作为正则初学者碰到这种嵌套XML结构的提取需求确实有点挠头,我来帮你搞定这个问题~
首先得明确咱们的核心目标:从指定<Tag>的CDATA嵌套列表里揪出最内层列表,还要同时拿到标签名,并且只保留那些非零有效数据项超过100的结果。你之前用的正则只是单纯提取数字,没法关联标签、区分嵌套层级,也没法满足数量筛选,所以肯定达不到要求。
解决方案思路
因为XML的嵌套结构特性,咱们得分两步走:先通过正则定位目标标签和对应的最内层列表,再用代码统计非零项数量做筛选(正则本身没法直接做计数判断,结合代码会更灵活可靠)。
1. 匹配目标标签与最内层列表的正则
假设你的XML结构里,最内层列表是没有嵌套其他[]的数字列表(比如[24779, 24780, ..., 24760]),可以用这个正则:
<Tag Name="([^"]+)"[^>]*>\s*<Data><!\[CDATA\[.*?(\[(?:(?!\[).)*?])\s*]]></Data>\s*</Tag>
咱们拆解下这个正则的关键部分:
([^"]+):捕获标签名(比如DUT_1_PC),确保只取到引号内的内容[^>]*>:匹配<Tag>标签的剩余部分,兼容任意属性\s*<Data><!\[CDATA\[:精准定位到CDATA的起始部分.*?(\[(?:(?!\[).)*?]):非贪婪匹配到最内层列表——(?!\[)是负向预查,确保列表内部没有其他[],保证抓到的是最内层\s*]]></Data>\s*</Tag>:匹配CDATA和标签的结尾,兼容空格换行
2. 结合代码筛选符合数量要求的结果
拿到匹配结果后,咱们用代码解析列表、统计非零项数量,筛选出符合条件的条目。以Python为例:
import re # 替换成你的XML内容 xml_content = """ <Tag Name="DUT_1_PC" OtherAttr="xxx"> <Data><![CDATA[ [ [1, 0, 2], [24779, 24780, ..., 24760] <!-- 这是最内层列表 --> ] ]]></Data> </Tag> <Tag Name="DUT_2_PC" OtherAttr="yyy"> <Data><![CDATA[ [0, 0, ..., 0] <!-- 非零项不足100,不提取 --> ]]></Data> </Tag> """ # 用刚才的正则匹配 pattern = r'<Tag Name="([^"]+)"[^>]*>\s*<Data><!\[CDATA\[.*?(\[(?:(?!\[).)*?])\s*]]></Data>\s*</Tag>' matches = re.findall(pattern, xml_content, re.DOTALL) # re.DOTALL让.匹配换行符 # 遍历结果,筛选非零项>100的条目 for tag_name, list_str in matches: # 解析列表里的数字 number_strs = [s.strip() for s in list_str.strip('[]').split(',') if s.strip().isdigit()] numbers = [int(num) for num in number_strs] # 统计非零项数量 non_zero_count = sum(1 for num in numbers if num != 0) if non_zero_count > 100: print(f"符合要求的标签: {tag_name}") print(f"提取的最内层列表: {list_str}\n")
注意事项
如果你的XML里最内层列表的格式有变化(比如包含小数、负号),可以调整正则里的数字匹配部分,比如把\d+改成-?\d+(?:\.\d+)?来兼容负数和小数。
内容的提问来源于stack exchange,提问作者MRA
相关产品推荐
相关产品推荐

