我正在尝试使用一行正则表达式解析导出为任务论文格式的 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+ 个字符)
-)
$
- 字符串结尾。