用于匹配导出为任务论文格式的全焦点项目的正则表达式



我正在尝试使用一行正则表达式解析导出为任务论文格式的 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+((.*)))*)$

这是一个链接,其中包含上述所有设置以尝试操作。

您可以将字符串的整个部分与@-groups匹配,然后将您需要处理的部分与另一个嵌套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 演示

主要模式细节:

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

相关内容

  • 没有找到相关文章

最新更新