正则表达式以匹配导出到任务纸窗体的Omnifocus项目

2024-05-19 01:42:01 发布

您现在位置:Python中文网/ 问答频道 /正文

我尝试使用一行regex解析导出为taskpaper格式的Omnifocus项目,但是捕获标记时遇到了困难,特别是每个@标记都有一个捕获组。你知道吗

以下是一个任务书片段:

- My Project
    - My Sub-Project @parallel(true) @autodone(false) @done(2017-04-01 11:12)
        - Task A: Do (1, 2, 3, @) @parallel(true) @autodone(false) @done(2017-04-01 10:43)
        - Task B: Do (4, 5, 6, @) @parallel(true) @autodone(false) @flagged @done(2017-04-01 10:58)
        - Task C: Read https://stackoverflow.com/ @parallel(true) @autodone(false) @flagged @done(2017-04-01 10:41)

以及我使用的Python正则表达式:

^(\t*)-(.*?)((@\w+\((.*)\))*)$

这里有a link with everything set up as above来尝试一下。你知道吗


Tags: 标记projectfalsetruetaskparallelmy格式
1条回答
网友
1楼 · 发布于 2024-05-19 01:42:01

您可以将字符串的整个部分与@-组匹配,然后拆分或与需要用另一个嵌套的re.findall处理的部分匹配:

import re
rx = re.compile(r"^(\t*)-\s*(.*?)((?:\s+@\w+(?:\([^)]*\))?)*)$")
ss = ["- My Project", " - My Sub-Project @parallel(true) @autodone(false) @done(2017-04-01 11:12)", "       - Task A: Do (1, 2, 3, @) @parallel(true) @autodone(false) @done(2017-04-01 10:43)", "      - Task B: Do (4, 5, 6, @) @parallel(true) @autodone(false) @flagged @done(2017-04-01 10:58)", "     - Task C: Read https://stackoverflow.com/ @parallel(true) @autodone(false) @flagged @done(2017-04-01 10:41)"]
for s in ss:
    match = [(m.group(2), re.findall(r'(@\w+)\(([^)]*)\)', m.group(3))) for m in rx.finditer(s)]
    print(match)

结果:

[('My Project', [])]
[('My Sub-Project', [('@parallel', 'true'), ('@autodone', 'false'), ('@done', '2017-04-01 11:12')])]
[('Task A: Do (1, 2, 3, @)', [('@parallel', 'true'), ('@autodone', 'false'), ('@done', '2017-04-01 10:43')])]
[('Task B: Do (4, 5, 6, @)', [('@parallel', 'true'), ('@autodone', 'false'), ('@done', '2017-04-01 10:58')])]
[('Task C: Read https://stackoverflow.com/', [('@parallel', 'true'), ('@autodone', 'false'), ('@done', '2017-04-01 10:41')])]

Python demo

主要图案细节:

  • ^-字符串开头
  • (\t*)-第1组:零个或多个选项卡
  • -\s*-连字符和0+空格
  • (.*?)-第2组:除换行符以外的任何0+字符
  • ((?:\s+@\w+(?:\([^)]*\))?)*)-第3组捕获0+个
    • \s+-1+空格
    • @\w+-a@后跟1+字字符
    • (?:\([^)]*\))?-一个可选的
      • \(-a(
      • [^)]*-0+除)以外的字符
      • \)-a)
  • $-字符串结尾。你知道吗

相关问题 更多 >

    热门问题