如何在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文件处理步骤总结
- 读取文件内容:
with open("xxx.txt", "r", encoding="utf-8") as f: content = f.read().strip() - 根据数据结构选择方法:
- 简单无重复标记:用字符串切片法
- 多组重复标记:用正则表达式
- 嵌套类XML结构:优先用XML解析器
内容的提问来源于stack exchange,提问作者Joker
相关产品推荐
相关产品推荐

