昨天我发布了一个与此类似的问题: Python Regex Named Groups。这项工作非常适合简单的事情。
经过一番研究,我读到了 pyparsing 库,它似乎非常适合我的任务。
text = '[@a eee, fff fff, ggg @b eee, fff, ggg @c eee eee, fff fff,ggg ggg@d]'
command_s = Suppress(Optional('[') + Literal('@'))
command_e = Suppress(Literal('@') | Literal(']'))
task = Word(alphas)
arguments = ZeroOrMore(
Word(alphas) +
Suppress(
Optional(Literal(',') + White()) | Optional(White() + Literal('@'))
)
)
command = Group(OneOrMore(command_s + task + arguments + command_e))
print command.parseString(text)
# which outputs only the first @a sequence
# [['a', 'eee', 'fff', 'fff', 'ggg']]
# the structure should be someting like:
[
['a', 'eee', 'fff fff', 'ggg'],
['b', 'eee', 'fff', 'ggg'],
['c', 'eee eee', 'fff fff', 'ggg ggg'],
['d']
]
@ 表示序列的开始,第一个单词是任务 (a),后跟可选的逗号分隔参数 (eee, fff fff, ggg)。问题是,上面的代码忽略了@b、@c 和@d。“fff fff”也被视为两个单独的参数,它应该只是一个。