如何使用正则表达式提取bjobs命令输出中的指定列数据
解决Python正则提取bjobs输出各列的问题
你的代码存在两个核心问题:
- 正则表达式里的
(w+)是笔误,正确写法应为(\w+)(缺少反斜杠导致无法匹配字母/数字); - 原正则仅能匹配前三个列的部分内容,且
re.findall只会返回捕获组的内容(也就是仅USER),后续的match.split()会因只有单个字符串而报错。
正确的正则提取方法
针对bjobs的输出格式,我们可以编写正则表达式捕获每一列的完整内容,用\s+匹配列之间的任意数量空格,结合行首行尾锚点确保匹配整行数据:
import re # 假设data是bjobs命令的输出内容 data = """JOBID USER JOB_NAME SUBMIT_TIME START_TIME RUN_TIME 24634 xyz abc Aug 22 17:10 Aug 22 21:47 01:30:19""" # 匹配数据行的正则,每个括号对应一列 pattern = r'^(\d+)\s+(\w+)\s+(\w+)\s+(\w+\s+\d+\s+\d+:\d+)\s+(\w+\s+\d+\s+\d+:\d+)\s+(\d+:\d+:\d+)$' # 跳过表头,处理数据行 for line in data.strip().split('\n')[1:]: match_result = re.match(pattern, line.strip()) if match_result: # 提取各列数据 jobid, user, job_name, submit_time, start_time, run_time = match_result.groups() # 按需输出 print(f"JobID: {jobid}, 用户: {user}, 任务名: {job_name}") print(f"提交时间: {submit_time}, 启动时间: {start_time}, 运行时长: {run_time}")
正则各捕获组说明
(\d+):匹配数字格式的JOBID;(\w+):匹配字母/数字格式的USER和JOB_NAME;(\w+\s+\d+\s+\d+:\d+):匹配包含月份、日期、时间的提交/启动时间;(\d+:\d+:\d+):匹配时分秒格式的运行时长。
另一种灵活方式(按空格分割)
如果不需要严格用正则,也可以直接按任意空格分割数据行(跳过表头后):
lines = data.strip().split('\n') headers = lines[0].split() row_data = lines[1].split() # 按表头对应数据 result = dict(zip(headers, row_data)) print(f"JobID: {result['JOBID']}, 用户: {result['USER']}")
内容的提问来源于stack exchange,提问作者Arti Bichkunde
相关产品推荐
相关产品推荐

