Python正则匹配提取job_name/job_action失败,求正确正则写法
修正正则表达式提取PL/SQL作业字段内容
问题场景
给定PL/SQL作业创建脚本,需提取job_name和job_action字段内容,但原Python代码使用正则替换后输出包含大量冗余内容,核心问题是误用正则方法,且正则规则未适配多行场景。
原代码问题分析
原代码使用re.sub()方法,该方法会替换文本中匹配部分并保留其余内容,而非仅提取目标字段;同时job_action的正则未处理多行内容,导致无法正确捕获完整的PL/SQL块。
修正方案
1. 提取job_name
使用re.search()匹配目标行并捕获单引号内的内容,正则适配任意缩进格式:
import re # 读取文件内容 with open("the_file.sql") as sfile: filesrc = sfile.read() # 提取job_name job_name_pattern = re.compile(r'^\s*job_name\s*=>\s*\'(.*?)\',', re.MULTILINE) name_match = job_name_pattern.search(filesrc) job_name = name_match.group(1) if name_match else "未找到job_name"
2. 提取job_action
job_action内容为多行PL/SQL块,需添加re.DOTALL模式让.匹配换行符,同时用非贪婪匹配捕获完整内容:
# 提取job_action job_action_pattern = re.compile(r'^\s*job_action\s*=>\s*\'(.*?)\',', re.MULTILINE | re.DOTALL) action_match = job_action_pattern.search(filesrc) job_action = action_match.group(1).strip() if action_match else "未找到job_action"
完整代码与输出
import re with open("the_file.sql") as sfile: filesrc = sfile.read() # 提取job_name job_name_pattern = re.compile(r'^\s*job_name\s*=>\s*\'(.*?)\',', re.MULTILINE) name_match = job_name_pattern.search(filesrc) job_name = name_match.group(1) if name_match else "未找到job_name" # 提取job_action job_action_pattern = re.compile(r'^\s*job_action\s*=>\s*\'(.*?)\',', re.MULTILINE | re.DOTALL) action_match = job_action_pattern.search(filesrc) job_action = action_match.group(1).strip() if action_match else "未找到job_action" print(f" Job Name: {job_name}") print(f" Job Action: {job_action}")
执行后输出:
Job Name: MY_JOB Job Action: begin run_this_proc; end;
内容的提问来源于stack exchange,提问作者Pro West
相关产品推荐
相关产品推荐

