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

Python:匹配复杂模式提取指定FUNCTION下的VARIABLE数据

问题描述

在Python中读取文本文件得到如下格式的字符串:

String= '''/begin FUNCTION N1ame1 Some texts and special char 
            /begin Variable_1name1  
                Adlkfj_dADDF_A32111 BAd_afd111
            /end Variable_1name1
            /begin Variable_1name2  
                Adlkfj_dADDF_A32222 BAd_afd222
            /end Variable_1name2
            /begin Variable_1name3    
                Adlkfj_dADDF_A32333 BAd333_afd333 333DSFadss
            /end Variable_1name3
            FUNCTION_DFADS
        /end FUNCTION
        /begin FUNCTION N2ame2 Sometexts and special char "dlfkjaodfja;lkd 
            /begin Variable_1name1  
                Adlkfj_dADDF_A32111_1 BAd_afd111_1
            /end Variable_1name1
            /begin Variable_1name2  
                Adlkfj_dADDF_A32222_2 BAd_afd222_2
            /end Variable_1name2
            /begin Variable_1name3  
                Adlkfj_dADDF_A32333_3 BAd333_afd333_3 333DSFadss_3
            /end Variable_1name3
            FUNCTION_DFADS
    /end FUNCTION'''

需求:根据指定的单个FUNCTION名称和一个或多个VARIABLE名称,提取对应VARIABLE块内的内容,示例如下:

  • 示例1:指定/begin FUNCTION N1ame1和/begin Variable_1name1,预期输出:
['Adlkfj_dADDF_A32111','BAd_afd111']
  • 示例2:指定/begin FUNCTION N2ame2和/begin Variable_1name1、/begin Variable_1name3,预期输出:
['Adlkfj_dADDF_A32111_1', 'BAd_afd111_1','Adlkfj_dADDF_A32333_3','BAd333_afd333_3','333DSFadss_3']

本人尝试了基础的正则匹配、split、findall等方法,但跨行模式匹配存在困难,已有循环实现方案,想了解是否可以通过正则表达式实现该需求,尝试的代码如下:

res = re.findall('begin(.*?)end', string, re.DOTALL)
print ( [s.split() for s in re.findall(r'/Variable_1name1\s+((?:.+\n)+?)/end ', String)] )
正则实现方案

可以通过分层匹配的方式实现:先定位目标FUNCTION块,再在该块内提取指定VARIABLE的内容。

实现代码

import re

def extract_variable_content(source_str, target_function, target_variables):
    # 匹配目标FUNCTION的整个块
    func_name = target_function.split()[-1]
    func_pattern = re.compile(
        rf'/begin FUNCTION {re.escape(func_name)}.*?/end FUNCTION',
        re.DOTALL
    )
    func_block_match = func_pattern.search(source_str)
    if not func_block_match:
        return []
    
    result = []
    # 在FUNCTION块内逐个提取目标VARIABLE的内容
    for var in target_variables:
        var_name = var.split()[-1]
        var_pattern = re.compile(
            rf'/begin {re.escape(var_name)}.*?\n\s+(.*?)\s+/end {re.escape(var_name)}',
            re.DOTALL
        )
        var_content_match = var_pattern.search(func_block_match.group())
        if var_content_match:
            # 按空白符分割内容并加入结果列表
            result.extend(var_content_match.group(1).split())
    
    return result

# 示例1测试
output1 = extract_variable_content(String, '/begin FUNCTION N1ame1', ['/begin Variable_1name1'])
print(output1)

# 示例2测试
output2 = extract_variable_content(String, '/begin FUNCTION N2ame2', ['/begin Variable_1name1', '/begin Variable_1name3'])
print(output2)

思路说明

  1. 定位FUNCTION块:用正则匹配目标FUNCTION的起始标记到对应/end FUNCTION的全部内容,通过re.DOTALL让.匹配换行符,确保捕获完整的FUNCTION块。
  2. 提取VARIABLE内容:在已捕获的FUNCTION块内,针对每个目标VARIABLE,匹配其/begin到/end之间的文本行,提取中间的有效内容并按空白符分割。
  3. 处理特殊字符:使用re.escape()转义FUNCTION和VARIABLE名称中的特殊字符,避免与正则语法冲突。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 17:27:14