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

正则表达式提取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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 07:58:57