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)
思路说明
- 定位FUNCTION块:用正则匹配目标FUNCTION的起始标记到对应
/end FUNCTION的全部内容,通过re.DOTALL让.匹配换行符,确保捕获完整的FUNCTION块。 - 提取VARIABLE内容:在已捕获的FUNCTION块内,针对每个目标VARIABLE,匹配其
/begin到/end之间的文本行,提取中间的有效内容并按空白符分割。 - 处理特殊字符:使用
re.escape()转义FUNCTION和VARIABLE名称中的特殊字符,避免与正则语法冲突。
内容的提问来源于stack exchange,提问作者ganesh
相关产品推荐
相关产品推荐

