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

如何用re库提取XML指定数据类型标签值?正则空值问题排查

使用Python的re库提取XML指定标签值的正确姿势

我来帮你搞定这个问题!首先得说清楚你原来的正则哪里出问题了:你写的<int|string>(.*?)</int|string>其实存在逻辑漏洞——</int|string>这个部分会被正则引擎解析成匹配</int 或者 string>,而不是匹配和开头对应的</int>或</string>。比如对于<string>GenIdeal</string>,开头匹配了<string>,但后面的闭合标签部分会找</int(不匹配)或者string>(前面是</,也不匹配),自然返回空列表。

解决方案1:修正正则表达式(用反向引用匹配对应闭合标签)

你可以用捕获组捕获开头的标签名,然后用反向引用\1来匹配对应的闭合标签,这样就能保证前后标签一致:

import re

elem = """<string> GenIdeal </string> <int>88</int> <char>A</char>"""
# 匹配int、string、char标签
pattern = r"<(int|string|char)>(.*?)</\1>"
results = re.findall(pattern, elem)
# 提取标签值(结果是元组列表,每个元组是(标签名, 值))
values = [val.strip() for tag, val in results]
print(values)  # 输出: ['GenIdeal', '88', 'A']

解释一下:

  • <(int|string|char)>:捕获组1匹配我们要的标签名(int/string/char)
  • (.*?):非贪婪匹配标签内的内容(避免匹配到其他标签)
  • </\1>:\1引用捕获组1的内容,保证闭合标签和开头标签完全一致

如果只想要值,不想保留标签名,也可以调整正则为非捕获组加反向引用:

pattern = r"<(?:int|string|char)>(.*?)</\1>"
results = re.findall(pattern, elem)
print([val.strip() for val in results])  # 直接得到值列表

解决方案2:优先使用XML解析库(更稳妥)

虽然正则能解决简单场景,但XML结构复杂时(比如标签带属性、嵌套标签、换行、转义字符等),正则很容易失效。Python自带的xml.etree.ElementTree是处理XML的标准库,更可靠:

import xml.etree.ElementTree as ET

# 假设你的XML内容在elem变量中,或者从文件读取
root = ET.fromstring(f"<root>{elem}</root>")  # 包裹成合法的XML根节点
target_tags = {'string', 'int', 'char'}
values = []

for tag in target_tags:
    elements = root.findall(f".//{tag}")
    values.extend([elem.text.strip() for elem in elements])

print(values)  # 输出: ['GenIdeal', '88', 'A']

这种方法能处理各种合法的XML结构,不会出现正则匹配不到的情况,推荐在生产环境中使用。

内容的提问来源于stack exchange,提问作者Avinash Sreethalam

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 09:04:14