正则表达式以匹配导出为任务纸格式的Omnifocus项目

时间:2017-07-18 09:08:52

标签: python regex

我正在尝试使用单线程正则表达式解析导出为任务纸格式的Omnifocus项目,但我很难捕获标记,特别是每个namespace ns { class A { static int bar() { return 21; } public: inline friend int foo(A& a) { return A::bar(); } friend int foo2(A& a); }; } // namespace ns int foo2(ns::A& a) // this will fail, since only ns::foo2() is friend of A { return foo(a); } namespace ns { int foo2(ns::A& a) // this works { return foo(a); } } // namespace ns int main(int, const char**, const char**) { ns::A var; return ns::foo(var) + ns::foo2(var); } 标记都有一个捕获组。

这是一个任务文章摘录:

@

和我使用的Python正则表达式:

- 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)

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

1 个答案:

答案 0 :(得分:2)

您可以将字符串的整个部分与@ -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 demo

主要模式细节:

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