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)
代码说明
- 区块匹配正则:
r'/start (INPUT_DATA|OUTPUT_DATA|LOC_DATA)\n\s*(.*?)\s*/end'- 精准匹配需要保留的区块类型,自动排除
LOC_THING \n\s*处理区块开头的换行和缩进空格(.*?)非贪婪捕获区块内的内容,避免跨区块匹配
- 精准匹配需要保留的区块类型,自动排除
- 字段提取:通过
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
相关产品推荐
相关产品推荐

