正则表达式匹配远销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+\((.*)\))*)$
答
您可以匹配与@ - 基团,然后字符串的整个部分无论是拆分或匹配那些需要处理与其他嵌套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')])]
主要花纹细节:
-
^
- 串的开始 -
(\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 –
您可以使用正则表达式的一个循序渐进的方式只能用正则表达式的PyPI模块。 're'不保留完整的捕获堆栈,只保留最后一个值,其他值在每次迭代时被覆盖。 –
[请检查您是否可以使用这个(http://rextester.com/WMI97528)。 –
Thanks @WiktorStribiżew,我最终捕获了整个标签部分,并在第二遍中查找标签组,如果有用,我做了这个要点:https://gist.github.com/KelSolaar/8df974c66f93f8c4b9de46a0b22584a6 没有闪亮的代码,但适用于我的用法。 –