使用Python正则解析todo.txt:无法匹配任务内容求助
解决todo.txt任务内容正则匹配问题
要准确捕获todo.txt中的任务核心内容,关键是调整正则的分组顺序和匹配逻辑,避免任务内容被其他特殊标记(项目、上下文、元数据等)覆盖。以下是可行的实现方案:
正则表达式设计思路
- 先匹配前置的固定元素:完成标记、优先级、完成/创建日期(均为可选)
- 用非贪婪匹配捕获任务内容,直到遇到第一个特殊标记(
+项目、@上下文、key:value元数据)或行尾 - 最后匹配所有后续的特殊标记,不干扰任务内容的捕获
具体实现代码
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
相关产品推荐
相关产品推荐

