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

如何使用正则表达式提取bjobs命令输出中的指定列数据

解决Python正则提取bjobs输出各列的问题

你的代码存在两个核心问题:

  1. 正则表达式里的(w+)是笔误,正确写法应为(\w+)(缺少反斜杠导致无法匹配字母/数字);
  2. 原正则仅能匹配前三个列的部分内容,且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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 10:35:21