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

如何在Python中提取字符串两值间的子字符串?(含类XML TXT场景)

解决思路与实现方案

一、基础字符串切片法(适合简单场景)

如果只是提取固定标记对之间的单个子串,直接用字符串的find()定位标记位置后切片即可:

def extract_between(s, start_tag, end_tag):
    # 定位起始标记的结束位置
    start_pos = s.find(start_tag)
    if start_pos == -1:
        return None
    start_pos += len(start_tag)
    # 从起始位置后定位结束标记
    end_pos = s.find(end_tag, start_pos)
    if end_pos == -1:
        return None
    return s[start_pos:end_pos]

# 示例:提取<Entrega>和</Entrega>之间的内容
sample_text = "<Entrega>00123</Entrega>"
print(extract_between(sample_text, "<Entrega>", "</Entrega>"))  # 输出: 00123

这种方法优点是轻量,但仅适用于标记唯一、无嵌套的简单结构,遇到重复标记容易出错。

二、正则表达式(适合多组重复标记)

如果需要批量提取多组相同标记的内容,正则的非贪婪匹配能高效处理:

提取单个标记对内容

import re

text = "<Entrega>00123</Entrega><Refer>MueblesHiroshima</Refer>"
# 用非贪婪匹配.*?避免匹配到后续其他标记
match = re.search(r"<Entrega>(.*?)</Entrega>", text)
if match:
    print(match.group(1))  # 输出: 00123

批量提取多组重复块内容

比如提取所有<EntregaItem>中的ItemId和NameItem:

import re

# 你的单行文本内容
content = "<Respuesta><ResultEnviado>...</ResultEnviado><EntregaItemResulados><EntregaItem><ItemId>123</ItemId><NameItem>MuebleSala</NameItem></EntregaItem><EntregaItem><ItemId>124</ItemId><NameItem>MuebleComedor</NameItem></EntregaItem></EntregaItemResulados></Respuesta>"

# 匹配每个EntregaItem块
item_blocks = re.findall(r"<EntregaItem>(.*?)</EntregaItem>", content, re.DOTALL)

# 遍历块提取具体字段
for block in item_blocks:
    item_id = re.search(r"<ItemId>(.*?)</ItemId>", block).group(1)
    item_name = re.search(r"<NameItem>(.*?)</NameItem>", block).group(1)
    print(f"物品ID: {item_id}, 名称: {item_name}")

输出:

物品ID: 123, 名称: MuebleSala
物品ID: 124, 名称: MuebleComedor

三、XML解析器(推荐,处理类XML结构)

你的数据是类XML格式,用专业XML解析器能处理嵌套结构,还能规避正则/字符串方法的格式漏洞。注意:如果原始数据有格式错误(比如示例中少了<的ValorItem>200</ValorItem>),可以用容错解析器修复。

标准库xml.etree.ElementTree(适用于格式正确的XML)

import xml.etree.ElementTree as ET

# 读取单行文件内容
with open("data.txt", "r", encoding="utf-8") as f:
    content = f.read().strip()

# 解析XML
root = ET.fromstring(content)

# 提取单个字段
entrega_num = root.find(".//Entrega").text
print(f"交付编号: {entrega_num}")

# 批量提取所有EntregaItem信息
for item in root.findall(".//EntregaItem"):
    item_id = item.find("ItemId").text
    name = item.find("NameItem").text
    valor = item.find("ValorItem").text
    print(f"ID: {item_id}, 名称: {name}, 价值: {valor}")

用lxml处理格式错误的XML

如果原始数据存在标签缺失等错误,lxml的恢复模式可以自动修复:

from lxml import etree

with open("data.txt", "r", encoding="utf-8") as f:
    content = f.read().strip()

# 创建容错解析器
parser = etree.XMLParser(recover=True)
root = etree.fromstring(content.encode(), parser=parser)

# 提取数据逻辑同上面的示例
entrega_num = root.find(".//Entrega").text
print(f"交付编号: {entrega_num}")

四、单行TXT文件处理步骤总结

  1. 读取文件内容:with open("xxx.txt", "r", encoding="utf-8") as f: content = f.read().strip()
  2. 根据数据结构选择方法:
    • 简单无重复标记:用字符串切片法
    • 多组重复标记:用正则表达式
    • 嵌套类XML结构:优先用XML解析器

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 00:16:07