Python re.findall()无法匹配txt文件中指定用户任务问题
任务管理器re.findall()匹配用户任务失效、程序无输出问题修复
已知问题信息
- 开发需求:实现任务管理器的任务筛选功能,登录用户可查看分配给自己的所有任务
- 任务存储规则:
tasks.txt为逗号分隔的文本文件,每行字段固定顺序为:用户名、任务标题、任务描述、分配日期、截止日期、完成状态 - 预期输出:admin账号登录查看自身任务时,需按固定格式展示任务标题、分配对象、分配日期、截止日期、完成状态、任务描述六个字段
- 实际异常:选择
vm(查看我的任务)菜单选项,输入用户名admin后程序无任务内容输出,终端停留在用户名输入完成后的步骤,无后续打印内容,程序直接停滞 - 异常关联代码:
vm菜单分支中使用re.findall()方法实现任务匹配,该方法未返回预期匹配结果
故障根因
- 正则写法缺陷:未开启多行匹配模式时,
re.findall()默认将整个文件内容作为单字符串匹配,若使用.*类贪婪匹配规则,遇到多行长文本容易触发正则回溯死循环,直接导致程序卡住无响应 - 匹配边界错误:正则未加行首匹配约束,无法精准定位到对应用户名开头的任务行,要么匹配到无关内容,要么完全匹配不到结果,后续打印逻辑因无有效输入静默中断
- 字段顺序错位:正则捕获组的顺序和
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
相关产品推荐
相关产品推荐

