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

Python提取指定标记间多组目标数据的正则表达式问题

提取文本指定区块内的字段

问题场景

有如下格式的文本内容,需要提取INPUT_DATA、OUTPUT_DATA、LOC_DATA区块内的所有字段,忽略LOC_THING区块及其他无关内容:

string = """unwanted strings

/start INPUT_DATA
    input_data_Name_One  input_data_Name_two
/end INPUT_DATA
unwanted string
/start OUTPUT_DATA 
    ouput_data_Name_One  ouput_data_Name_Two 
/end OUTPUT_DATA
unwanted string
/start LOC_DATA   
    loc_Data_Name_One  loc_data_Name_Two  loc_data_Name_Three
/end LOC_DATA
unwanted string
/start LOC_THING   
    no_Need_One no_Need_Two  no_Need_Three
/end LOC_THING

unwanted strings"""

尝试用matches = re.findall('start(.*?)end', string, re.DOTALL)提取时出现问题,期望得到结果:

['input_data_Name_One' ,'input_data_Name_two','ouput_data_Name_One','ouput_data_Name_Two','loc_Data_Name_One','loc_data_Name_Two','loc_data_Name_Three']

解决方案

原正则的问题是未匹配/start和/end的斜杠,且未过滤不需要的区块,同时直接捕获的是区块内的全部内容而非单独字段。可以分两步处理:

代码实现

import re

string = """unwanted strings

/start INPUT_DATA
    input_data_Name_One  input_data_Name_two
/end INPUT_DATA
unwanted string
/start OUTPUT_DATA 
    ouput_data_Name_One  ouput_data_Name_Two 
/end OUTPUT_DATA
unwanted string
/start LOC_DATA   
    loc_Data_Name_One  loc_data_Name_Two  loc_data_Name_Three
/end LOC_DATA
unwanted string
/start LOC_THING   
    no_Need_One no_Need_Two  no_Need_Three
/end LOC_THING

unwanted strings"""

# 匹配目标区块的内容,仅捕获INPUT_DATA、OUTPUT_DATA、LOC_DATA这三类
block_pattern = r'/start (INPUT_DATA|OUTPUT_DATA|LOC_DATA)\n\s*(.*?)\s*/end'
blocks = re.findall(block_pattern, string, re.DOTALL)

# 提取每个区块内的字段并合并
result = []
for _, content in blocks:
    # 按空白字符分割,过滤空字符串
    fields = [field for field in content.split() if field]
    result.extend(fields)

print(result)

代码说明

  1. 区块匹配正则:r'/start (INPUT_DATA|OUTPUT_DATA|LOC_DATA)\n\s*(.*?)\s*/end'
    • 精准匹配需要保留的区块类型,自动排除LOC_THING
    • \n\s*处理区块开头的换行和缩进空格
    • (.*?)非贪婪捕获区块内的内容,避免跨区块匹配
  2. 字段提取:通过split()按空白字符分割区块内容,过滤分割后产生的空字符串,最后合并所有字段得到目标列表。

运行结果

['input_data_Name_One', 'input_data_Name_two', 'ouput_data_Name_One', 'ouput_data_Name_Two', 'loc_Data_Name_One', 'loc_data_Name_Two', 'loc_data_Name_Three']

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 11:45:58