如何用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
相关产品推荐
相关产品推荐

