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

Python re.findall()无法匹配txt文件中指定用户任务问题

任务管理器re.findall()匹配用户任务失效、程序无输出问题修复

已知问题信息

  • 开发需求:实现任务管理器的任务筛选功能,登录用户可查看分配给自己的所有任务
  • 任务存储规则:tasks.txt为逗号分隔的文本文件,每行字段固定顺序为:用户名、任务标题、任务描述、分配日期、截止日期、完成状态
  • 预期输出:admin账号登录查看自身任务时,需按固定格式展示任务标题、分配对象、分配日期、截止日期、完成状态、任务描述六个字段
  • 实际异常:选择vm(查看我的任务)菜单选项,输入用户名admin后程序无任务内容输出,终端停留在用户名输入完成后的步骤,无后续打印内容,程序直接停滞
  • 异常关联代码:vm菜单分支中使用re.findall()方法实现任务匹配,该方法未返回预期匹配结果

故障根因

  1. 正则写法缺陷:未开启多行匹配模式时,re.findall()默认将整个文件内容作为单字符串匹配,若使用.*类贪婪匹配规则,遇到多行长文本容易触发正则回溯死循环,直接导致程序卡住无响应
  2. 匹配边界错误:正则未加行首匹配约束,无法精准定位到对应用户名开头的任务行,要么匹配到无关内容,要么完全匹配不到结果,后续打印逻辑因无有效输入静默中断
  3. 字段顺序错位:正则捕获组的顺序和tasks.txt实际存储的字段顺序不一致,就算匹配到内容也无法正确拆分字段,格式化输出环节因缺字段直接终止

可直接复用的修复代码

替换原有vm菜单分支的实现逻辑即可:

import re

# vm 查看我的任务分支逻辑
current_username = input("请输入登录用户名:").strip()
# 读取任务文件全量内容
with open("tasks.txt", "r", encoding="utf-8") as f:
    all_task_text = f.read()
# 修正正则规则:行首精准匹配当前用户名,按文件存储顺序捕获字段,开启多行匹配模式
task_pattern = re.compile(
    rf"^{re.escape(current_username)},([^,]*),([^,]*),([^,]*),([^,]*),([^,\r\n]*)$",
    flags=re.MULTILINE
)
user_tasks = task_pattern.findall(all_task_text)

# 格式化输出
if not user_tasks:
    print("当前账号下暂无分配的任务")
else:
    print("*" * 60)
    print(f"账号 {current_username} 的分配任务列表:")
    for index, task_item in enumerate(user_tasks, 1):
        task_title, task_desc, assign_date, deadline, finish_status = task_item
        print(f"\n===== 任务 {index} =====")
        print(f"任务标题:{task_title}")
        print(f"分配对象:{current_username}")
        print(f"分配日期:{assign_date}")
        print(f"截止日期:{deadline}")
        print(f"完成状态:{finish_status}")
        print(f"任务描述:{task_desc}")
    print("*" * 60)

关键修复说明

  • 调用re.escape()处理用户名中的正则特殊字符,避免特殊字符导致匹配失效
  • 用[^,]*匹配单个逗号分隔字段,从根源上避免贪婪匹配触发的回溯死循环问题
  • 开启re.MULTILINE模式,让^/$锚点匹配每行的首尾,精准定位单条任务记录
  • 增加空结果兜底判断,避免无匹配时程序无输出

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 07:31:27