我正在尝试使用单线程正则表达式解析导出为任务纸格式的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)
答案 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')])]
主要模式细节:
^
- 字符串开头(\t*)
- 第1组:零个或多个标签-\s*
- 连字符和0+空格(.*?)
- 第2组:除了换行符之外的任何0 +字符((?:\s+@\w+(?:\([^)]*\))?)*)
- 第3组捕获0+序列
\s+
- 1+空格@\w+
- @
后跟1 +字词(?:\([^)]*\))?
- 可选序列
\(
- (
[^)]*
- 除)
\)
- )
$
- 字符串结束。