正则表达式匹配远销taskpaper格式的OmniFocus项目

问题描述:

我试图用一个正则表达式班轮解析远销taskpaper格式的OmniFocus的项目,但我在拍摄的标签很难,每@标签特别是具有捕获组。正则表达式匹配远销taskpaper格式的OmniFocus项目

这里是一个taskpaper片段:

- 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://*.com/ @parallel(true) @autodone(false) @flagged @done(2017-04-01 10:41) 

,我使用Python正则表达式:

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

这里是a link with everything set up as above尝试的事情。

+1

您可以使用正则表达式的一个循序渐进的方式只能用正则表达式的PyPI模块。 're'不保留完整的捕获堆栈,只保留最后一个值,其他值在每次迭代时被覆盖。 –

+0

[请检查您是否可以使用这个(http://rextester.com/WMI97528)。 –

+0

Thanks @WiktorStribiżew,我最终捕获了整个标签部分,并在第二遍中查找标签组,如果有用,我做了这个要点:https://gist.github.com/KelSolaar/8df974c66f93f8c4b9de46a0b22584a6 没有闪亮的代码,但适用于我的用法。 –

您可以匹配与@ - 基团,然后字符串的整个部分无论是拆分或匹配那些需要处理与其他嵌套re.findall部分:

import re 
rx = re.compile(r"^(\t*)-\s*(.*?)((?:\[email protected]\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://*.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://*.com/', [('@parallel', 'true'), ('@autodone', 'false'), ('@done', '2017-04-01 10:41')])] 

查看Python demo

主要花纹细节:

  • ^ - 串的开始
  • (\t*) - 第1组:零个或多个标签
  • -\s* - 连字符和空格0+
  • (.*?) - 组2:任何0+比换行符字符
  • 其它字符1+空格-
  • ((?:\[email protected]\w+(?:\([^)]*\))?)*) - 的
    • \s+组3捕获0+序列
    • @\w+ - 一个@随后与1+字字符
    • (?:\([^)]*\))? - 的
      • \(可选序列 - 一个(
      • [^)]* - 比)
      • \)其他0+字符 - 一个)
  • $ - 字符串的结尾。
+0

是的,它几乎是我最终做的根据这个评论:https://*.com/questions/45162267/regular-expression-to-match-omnifocus-projects-exported-to-taskpaper-format/45182602# comment77330314_45162267 –