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

使用Python正则解析todo.txt:无法匹配任务内容求助

解决todo.txt任务内容正则匹配问题

要准确捕获todo.txt中的任务核心内容,关键是调整正则的分组顺序和匹配逻辑,避免任务内容被其他特殊标记(项目、上下文、元数据等)覆盖。以下是可行的实现方案:

正则表达式设计思路

  1. 先匹配前置的固定元素:完成标记、优先级、完成/创建日期(均为可选)
  2. 用非贪婪匹配捕获任务内容,直到遇到第一个特殊标记(+项目、@上下文、key:value元数据)或行尾
  3. 最后匹配所有后续的特殊标记,不干扰任务内容的捕获

具体实现代码

import re

# 编译支持verbose模式的正则,结构更清晰
todo_parser = re.compile(
    r"""
    ^
    (?:x\s+)?                          # 可选的完成标记(x 后跟空格)
    (?:\(([A-Z])\)\s+)?                # 可选的优先级(大写字母包裹在括号中)
    (?:(\d{4}-\d{2}-\d{2})\s+)?        # 可选的完成日期(yyyy-mm-dd格式)
    (?:(\d{4}-\d{2}-\d{2})\s+)?        # 可选的创建日期(yyyy-mm-dd格式)
    (?P<task>.*?)                      # 核心任务内容(非贪婪匹配,避免覆盖后续标记)
    (?:\s+(?:\+(\w+)|@(\w+)|(\w+):(\S+)))*  # 匹配所有项目、上下文、元数据
    $
    """,
    re.VERBOSE
)

# 测试用例
test_todos = [
    "x (A) 2024-05-01 2024-04-25 Call @Bob about +ProjectX due:2024-05-20",
    "(B) 2024-04-26 Finish quarterly report for +ClientY",
    "Buy organic milk @downtown_grocery",
    "Submit travel expense report due:2024-05-15",
    "Fix login bug - refer to doc:issue#123"
]

# 解析并输出结果
for todo in test_todos:
    match_result = todo_parser.match(todo)
    if match_result:
        task_content = match_result.group('task').strip()
        print(f"任务内容: '{task_content}'")
        print(f"优先级: {match_result.group(1) or '无'}")
        print(f"完成日期: {match_result.group(2) or '无'}")
        print(f"创建日期: {match_result.group(3) or '无'}")
        print("-" * 40)

关键细节说明

  • 使用.*?非贪婪匹配任务内容,确保不会把后续的特殊标记包含进来
  • 用strip()去除任务内容前后的冗余空格,因为非贪婪匹配可能捕获到标记前的空格
  • 元数据匹配使用\w+:\S+,支持value包含连字符、数字等非单词字符(符合todo.txt规范)
  • 所有非捕获组((?:...))用于匹配固定元素但不占用分组,避免干扰任务内容的捕获

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 23:27:49